List<QWSY20> queryDealerCode List<Tqwsy27> amp 两个list中都存在可获取的dealerCode,如何去除amp中重复的queryDealerCode
时间: 2025-07-20 17:18:10 AIGC 浏览: 18
<think>我们有两个列表:`List<QWSY20> queryDealerCode` 和 `List<Tqwsy27> amp`。目标是从`amp`中去除那些在`queryDealerCode`中已经存在的`dealerCode`(假设两个列表中的元素都有`dealerCode`字段,且类型为字符串)。
步骤:
1. 首先,我们需要从`queryDealerCode`中提取所有`dealerCode`,并放入一个集合(Set)中,以便快速查找。
2. 然后,遍历`amp`列表,将那些`dealerCode`不在第一步得到的集合中的元素保留下来,从而去除重复。
注意:这里“重复”指的是`amp`中的某个元素的`dealerCode`在`queryDealerCode`列表的某个元素中出现过。
假设两个列表中的元素类都有`getDealerCode()`方法。
具体实现:
方案1:使用Java Stream API(推荐,代码简洁)
```java
// 步骤1:提取queryDealerCode列表中的所有dealerCode,放入一个Set
Set<String> existingDealerCodes = queryDealerCode.stream()
.map(QWSY20::getDealerCode)
.collect(Collectors.toSet());
// 步骤2:过滤amp列表,只保留那些dealerCode不在existingDealerCodes中的元素
List<Tqwsy27> filteredAmp = amp.stream()
.filter(item -> !existingDealerCodes.contains(item.getDealerCode()))
.collect(Collectors.toList());
```
方案2:传统循环(如果使用较旧版本的Java)
```java
Set<String> existingDealerCodes = new HashSet<>();
for (QWSY20 item : queryDealerCode) {
existingDealerCodes.add(item.getDealerCode());
}
List<Tqwsy27> filteredAmp = new ArrayList<>();
for (Tqwsy27 item : amp) {
if (!existingDealerCodes.contains(item.getDealerCode())) {
filteredAmp.add(item);
}
}
```
注意事项:
- 如果`dealerCode`可能为`null`,需要处理。在Set中,`null`值也是允许的(但只能有一个),所以`contains(null)`可以判断。但是,如果业务逻辑中不允许`dealerCode`为`null`,则可以在提取时过滤掉`null`。
- 使用Set的查找时间复杂度为O(1),所以整体效率较高。
示例:如果`queryDealerCode`列表中有dealerCode为["A","B","C"],而`amp`列表中的dealerCode为["A","D","E","B"],那么过滤后的`amp`列表将只包含["D","E"]。
如果两个列表很大,使用Stream API并利用并行流可能提高性能,但一般情况下,上述方法已经足够高效。
另外,如果两个列表中的`dealerCode`区分大小写,那么直接使用HashSet即可。如果不区分大小写,可以使用`TreeSet(String.CASE_INSENSITIVE_ORDER)`。
例如,如果要不区分大小写:
```java
Set<String> existingDealerCodes = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
existingDealerCodes.addAll(queryDealerCode.stream().map(QWSY20::getDealerCode).collect(Collectors.toList()));
```
然后使用同样的过滤方式。
但是注意:如果使用不区分大小写的Set,那么要确保在过滤的时候也是不区分大小写的,而上面的过滤`contains`方法在`TreeSet`中已经是不区分大小写的了。
完整示例代码(区分大小写):
```java
import java.util.*;
import java.util.stream.Collectors;
public class RemoveDuplicates {
public static void main(String[] args) {
// 模拟数据
List<QWSY20> queryDealerCode = Arrays.asList(
new QWSY20("A"),
new QWSY20("B"),
new QWSY20("C")
);
List<Tqwsy27> amp = Arrays.asList(
new Tqwsy27("A"),
new Tqwsy27("D"),
new Tqwsy27("E"),
new Tqwsy27("B")
);
Set<String> existingDealerCodes = queryDealerCode.stream()
.map(QWSY20::getDealerCode)
.collect(Collectors.toSet());
List<Tqwsy27> filteredAmp = amp.stream()
.filter(item -> !existingDealerCodes.contains(item.getDealerCode()))
.collect(Collectors.toList());
// 输出结果:应该只有D和E
filteredAmp.forEach(item -> System.out.println(item.getDealerCode()));
}
}
// 假设的类
class QWSY20 {
private String dealerCode;
public QWSY20(String dealerCode) { this.dealerCode = dealerCode; }
public String getDealerCode() { return dealerCode; }
}
class Tqwsy27 {
private String dealerCode;
public Tqwsy27(String dealerCode) { this.dealerCode = dealerCode; }
public String getDealerCode() { return dealerCode; }
}
```
输出:
D
E
这样,我们就从`amp`中移除了在`queryDealerCode`中已经存在的经销商代码。</think>### 从两个 List 中去除重复的 dealerCode(Java实现)
#### 解决方案步骤
假设两个列表中的元素类结构如下:
```java
class QWSY20 {
private String dealerCode;
public String getDealerCode() {
return dealerCode;
}
}
class Tqwsy27 {
private String dealerCode;
public String getDealerCode() {
return dealerCode;
}
}
```
##### 方法1:使用 Stream API(推荐)
```java
import java.util.*;
import java.util.stream.Collectors;
// 步骤1:提取 queryDealerCode 的所有 dealerCode 到 Set
Set<String> existingCodes = queryDealerCode.stream()
.map(QWSY20::getDealerCode)
.filter(Objects::nonNull) // 过滤 null 值
.collect(Collectors.toSet());
// 步骤2:过滤 amp 列表,排除重复值
List<Tqwsy27> filteredList = amp.stream()
.filter(item ->
item.getDealerCode() != null &&
!existingCodes.contains(item.getDealerCode())
)
.collect(Collectors.toList());
```
##### 方法2:传统循环(兼容旧版 Java)
```java
Set<String> existingCodes = new HashSet<>();
for (QWSY20 item : queryDealerCode) {
if (item.getDealerCode() != null) {
existingCodes.add(item.getDealerCode());
}
}
List<Tqwsy27> filteredList = new ArrayList<>();
for (Tqwsy27 item : amp) {
String code = item.getDealerCode();
if (code != null && !existingCodes.contains(code)) {
filteredList.add(item);
}
}
```
#### 关键点说明
1. **去重原理**:
- 使用 `HashSet` 存储 `queryDealerCode` 的 dealerCode(O(1) 查找复杂度)
- 通过 `Set.contains()` 快速判断重复值[^1]
2. **空值处理**:
- 添加 `item.getDealerCode() != null` 检查
- 避免 `NullPointerException` 和无效数据
3. **时间复杂度**:
- **O(n + m)**:n 是 queryDealerCode 长度,m 是 amp 长度
- 比嵌套循环(O(n*m))效率更高
4. **区分大小写**:
- 默认区分大小写("A001" ≠ "a001")
- 如需忽略大小写,改用 `TreeSet<String>(String.CASE_INSENSITIVE_ORDER)`
#### 完整示例
```java
public class DealerFilter {
public static void main(String[] args) {
// 模拟数据
List<QWSY20> queryDealerCode = Arrays.asList(
new QWSY20("A001"), new QWSY20("B002"), new QWSY20("C003")
);
List<Tqwsy27> amp = Arrays.asList(
new Tqwsy27("A001"), // 重复
new Tqwsy27("D004"),
new Tqwsy27("B002"), // 重复
new Tqwsy27("E005")
);
// 执行过滤
Set<String> existingCodes = queryDealerCode.stream()
.map(QWSY20::getDealerCode)
.collect(Collectors.toSet());
List<Tqwsy27> result = amp.stream()
.filter(item -> !existingCodes.contains(item.getDealerCode()))
.collect(Collectors.toList());
// 验证结果: [D004, E005]
result.forEach(item ->
System.out.println(item.getDealerCode())
);
}
}
```
#### 特殊场景处理
1. **海量数据优化**:
```java
// 并行流加速处理(数据量 > 10,000 时生效)
List<Tqwsy27> result = amp.parallelStream()
.filter(...)
.collect(Collectors.toList());
```
2. **多字段去重**:
```java
// 使用复合键(如 dealerCode + region)
Set<String> keys = queryDealerCode.stream()
.map(item -> item.getDealerCode() + "|" + item.getRegion())
.collect(Collectors.toSet());
```
3. **保留顺序**:
```java
// 使用 LinkedHashSet 保持插入顺序
Set<String> existingCodes = new LinkedHashSet<>(...);
```
通过上述方法,可高效地从 `amp` 列表中移除与 `queryDealerCode` 重复的经销商代码。
阅读全文
相关推荐










