【java】将List中的实体按照某个字段进行分组的算法

/** 
* 按照异常批次号对已开单数据进行分组
* @param billingList
* @return
* @throws Exception
*/
private Map<String, List<TmExcpNewVo>> groupBillingDataByExcpBatchCode(List<TmExcpNewVo> billingList) throws Exception{
Map<String, List<TmExcpNewVo>> resultMap = new HashMap<String, List<TmExcpNewVo>>();

try{
for(TmExcpNewVo tmExcpNew : billingList){

if(resultMap.containsKey(tmExcpNew.getExcpbatch())){//map中异常批次已存在,将该数据存放到同一个key(key存放的是异常批次)的map中
resultMap.get(tmExcpNew.getExcpbatch()).add(tmExcpNew);
}else{//map中不存在,新建key,用来存放数据
List<TmExcpNewVo> tmpList = new ArrayList<TmExcpNewVo>();
tmpList.add(tmExcpNew);
resultMap.put(tmExcpNew.getExcpbatch(), tmpList);

}

}

}catch(Exception e){
throw new Exception("按照异常批次号对已开单数据进行分组时出现异常", e);
}

return resultMap;
}
### Java 8 中基于对象属性对 `List` 进行去重的最佳实践 在 Java 8 中,可以通过多种方式实现根据对象特定属性来去除 `List` 中的重复元素。最常用的方式之一是利用 Stream API 和 Lambda 表达式的组合。 #### 使用 Stream API 及 Collectors.toMap() 通过使用 `Collectors.toMap()` 方法可以有效地按照指定键(即对象中的某个字段)进行分组,并自动处理冲突情况: ```java import java.util.*; import java.util.stream.Collectors; class User { private String name; private int age; public User(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "User{name='" + name + "', age=" + age + '}'; } // Getters and setters... } public class Main { public static void main(String[] args) { List<User> users = Arrays.asList( new User("Alice", 30), new User("Bob", 25), new User("Alice", 35), // Duplicate by name but different ages. new User("Charlie", 40)); Map<String, User> uniqueUsersByName = users.stream() .collect(Collectors.toMap(User::getName, user -> user, (existing, replacement) -> existing)); // Conflict resolution strategy. System.out.println(uniqueUsersByName.values()); } } ``` 这段代码会保留第一次遇到的对象实例作为唯一代表[^1]。 #### 利用 `distinct()` 结合自定义比较器 另一种方法是在流操作中加入过滤逻辑,先映射到需要判断唯一的属性上再调用 `distinct()` 函数完成筛选工作: ```java import java.util.*; import java.util.stream.Collectors; // Assuming we have a similar 'User' class definition here... public class DistinctByPropertyExample { public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) { Set<Object> seen = ConcurrentHashMap.newKeySet(); return t -> seen.add(keyExtractor.apply(t)); } public static void main(String[] args) { List<User> users = ... ; // Initialize your list of Users List<User> result = users.stream().filter(distinctByKey(User::getName)).toList(); System.out.println(result); } } ``` 这种方法更加灵活通用,适用于任何类型的实体类以及任意数量的关键字匹配条件[^2]。 #### 性能考量与注意事项 当数据量较大时,上述两种解决方案都能提供良好的性能表现;然而,在实际应用开发过程中还需要考虑内存占用等因素的影响。如果目标集合非常庞大,则可能需要探索更为高效的算法或者采用分布式计算框架来进行大规模数据集上的相似度分析任务。 另外值得注意的是,无论是哪种方式都需要确保所选作区分依据的那个成员变量具备稳定的哈希码生成机制,这样才能保证程序运行期间的一致性和准确性[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值