java,一个集合中有多条记录,每条记录有accNo、custNo、billNo,每条记录的账号和客户号可能相同,但billNo不同,如果条记录的账号和客户号相同,则取billNo最大的那条记录,billNo为长度32位的纯数字字符串,如何过滤,给出对应的代码
时间: 2024-10-17 08:12:59 浏览: 13
在Java中,你可以使用`Map`结合`Comparator`来解决这个问题。由于`Map`不允许重复键值对,我们可以使用`(账户号, 客户号, billNo)`作为键,`billNo`作为值,并附带一个自定义的比较器,以便在遇到相同的键时找到最大值的billNo。
首先,创建一个`BillRecord`类来代表记录:
```java
public class BillRecord {
private String accNo;
private String custNo;
private String billNo;
// 构造函数, getter 和 setter...
}
```
然后,定义一个`BillComparator`类,用于比拟能找到最大billNo的记录:
```java
import java.util.Comparator;
public class BillComparator implements Comparator<BillRecord> {
@Override
public int compare(BillRecord a, BillRecord b) {
return b.getBillNo().compareTo(a.getBillNo());
}
}
```
接着,在处理数据的时候,可以遍历原始集合,将结果存储到一个新的`Map`中,键是`(accNo, custNo)`,值是一个列表,列表中的元素按照`BillComparator`排序:
```java
List<BillRecord> records = ... // 原始记录列表
Map<String, List<BillRecord>> groupedRecords = new HashMap<>();
for (BillRecord record : records) {
String key = record.getAccNo() + "_" + record.getCustNo();
if (!groupedRecords.containsKey(key)) {
groupedRecords.put(key, new ArrayList<>());
}
groupedRecords.get(key).add(record);
// 如果已经存在相同key,按billNo更新最大值
if (!groupedRecords.get(key).isEmpty()) {
groupedRecords.get(key).sort(new BillComparator());
}
}
// 最终的结果是每个账户+客户的最大billNo的记录列表
List<BillRecord> maxBillNos = new ArrayList<>();
for (List<BillRecord> list : groupedRecords.values()) {
if (!list.isEmpty()) {
maxBillNos.add(list.get(0));
}
}
```
阅读全文