我有一个名为find_duplicates(List<DP> dp_list)
的方法,它采用我的自定义数据类型DP的ArrayList。每个DP都有一个名为“ID”的字符串,每个DP都应该是唯一的。
我的方法遍历整个列表,并将任何没有唯一ID的DP添加到另一个ArrayList,该方法在方法完成时返回。它还将DP的布尔字段isUnique
从true更改为false。
我想让这个方法成为多线程的,因为元素的每次检查都独立于其他元素的检查。但是对于每次检查,线程都需要读取dp_list。是否可以同时将同一列表的读取访问权限提供给不同的线程?你能建议一种让它成为多线程的方法吗?
现在我的代码看起来像这样 -
List<DP> find_duplicates(List<DP> dp_list){
List<DP> dup_list = new ArrayList<>();
for(DP d: dp_list){
-- Adds d to dup_list and sets d.isUnique=false if d.ID is not unique --
}
return dup_list;
}
答案 0 :(得分:1)
List<DP> unique = dp_list.stream().parallel().distinct().collect(Collectors.toList());
然后只需找到原始列表与唯一元素列表之间的差异,即可获得重复项。
显然,如果您的项目仅由其中一个字段唯一,那么您将需要一个过滤器 - 快速搜索&#34;按键排序&#34;可以提供多种方法来实现这一目标。
答案 1 :(得分:1)
似乎您希望在可能的情况下利用并行性。首先,我建议使用命令式方法测量代码,或使用顺序流然后,如果您认为通过并行可以真正帮助提高性能然后你可以使用并行流。 see here to help decide when to use a parallel stream
至于完成手头的任务,可以按如下方式完成:
List<DP> find_duplicates(List<DP> dp_list){
List<DP> dup_list = dp_list.stream() //dp_list.parallelStream()
.collect(Collectors.groupingBy(DP::getId))
.values()
.stream()
.filter(e -> e.size() > 1)
.flatMap(Collection::stream)
.collect(Collectors.toList());
dup_list.forEach(s -> s.setUnique(false));
return dup_list;
}
这将从源创建一个流,然后按其ID对元素进行分组,并保留所有具有重复ID的元素,然后最终将isUnique
字段设置为false
;
答案 2 :(得分:0)
有更好的方法可以做到这一点。
您需要做的就是获取list
的锁定并检查项目是否存在,然后进一步处理。
void find_duplicates(List<DP> dp_list, DP item){
synchronized(dp_list){
if(dp_list.contains(item)){
//Set your flags
}
}
}