Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
添加时Java集重复失败的附加处理_Java - Fatal编程技术网

添加时Java集重复失败的附加处理

添加时Java集重复失败的附加处理,java,Java,我在一个散列集中积累了一些独特的对象,这些对象来自于对一个超出我控制范围的服务方法的多次调用,该服务方法返回一个列表 另外一个要求是,如果在此过程中发现任何重复项,我需要生成一封电子邮件。我可以自己检查重复项并保留一个插入或跳过的列表,但我不会使用一个从外部列表自动执行此操作的集。显然,在Set Add失败时不会出现try/catch,但是有更好的方法吗 HashSet<Record> set = new HashSet<Record>(); for (String or

我在一个
散列集中积累了一些独特的对象,这些对象来自于对一个超出我控制范围的服务方法的多次调用,该服务方法返回一个
列表

另外一个要求是,如果在此过程中发现任何重复项,我需要生成一封电子邮件。我可以自己检查重复项并保留一个插入或跳过的
列表,但我不会使用一个从外部列表自动执行此操作的
集。显然,在Set Add失败时不会出现try/catch
,但是有更好的方法吗

HashSet<Record> set = new HashSet<Record>();
for (String org: orgs) {            
   // External service call
   List<Record> result = service.getRecords(org); 
   // Add All to Set (also need to detect duplicates with resulting logic)
   set.addAll(result);
}
HashSet=newhashset();
对于(字符串组织:组织){
//外部服务呼叫
列表结果=service.getRecords(组织);
//将全部添加到集合(还需要使用结果逻辑检测重复项)
set.addAll(结果);
}

这取决于结果本身是否包含重复记录, 一个人是否能够不加考虑地处理记录的第三次出现

Set<Record> set = new HashSet<>();
for (String org: orgs) {            
    // External service call
    List<Record> result = service.getRecords(org); 
    // Add All to Set (also need to detect duplicates with resulting logic)
    for (Record record: result) {
        if (!set.add(record)) {
            // Handle duplicate by individual record:
            ...
        }
    }
}
Set Set=newhashset();
对于(字符串组织:组织){
//外部服务呼叫
列表结果=service.getRecords(组织);
//将全部添加到集合(还需要使用结果逻辑检测重复项)
用于(记录:结果){
如果(!set.add(记录)){
//按单个记录处理重复:
...
}
}
}
或:

Set Set=newhashset();
Set duplicates=new HashSet();
对于(字符串组织:组织){
//外部服务呼叫
列表结果=service.getRecords(组织);
//将全部添加到集合(还需要使用结果逻辑检测重复项)
Set duplicateResult=new.HashSet(结果);
重复结果。保留(集合);
duplicates.addAll(duplicateResult);
set.addAll(结果);
}
用于(记录:重复){
//处理重复一次:
...
}

我不太明白问题出在哪里。(Record res:result){if(set.contains(res))duplicateFoundCode(res);set.add(res);}
有什么问题吗?谢谢,但这就像使用列表一样吗?我可以使用具有相同代码的列表。顺便说一句,您的提示的一个问题是,我得到了一个列表,每次我得到初步结果时,我都需要额外的遍历来检测重复。如果要求只是在发现重复时生成电子邮件,为什么不在addAll方法之前和之后比较设置大小?如果结果等于PreviousSetSize+ListSize,则不存在重复,如果结果较小,则存在重复。为什么4行代码(如果使用Java8,它也是1行代码,尽管答案是不使用它)比1行代码好,加上每次迭代都使用If。不过,它提供了准确的记录,所以请根据自己的目的使用它。如果您只需要电子邮件中重复项的数量,请使用我的解决方案,如果您需要计数,则必须使用计数器来增加,否则,您将试图避免保留以前的设置大小。是的,这是一个很好的解决方案。至少
!set.add(record)
为我省去了执行
contains
的麻烦,否则我将不得不这样做。不幸的是,仍然需要遍历临时调用结果,但总体来说要好得多。
Set<Record> set = new HashSet<>();
Set<Record> duplicates = new HashSet<>();
for (String org: orgs) {            
    // External service call
    List<Record> result = service.getRecords(org); 
    // Add All to Set (also need to detect duplicates with resulting logic)
    Set<Record> duplicateResult = new .HashSet<>(result);
    duplicateResult.retainAll(set);
    duplicates.addAll(duplicateResult);
    set.addAll(result);
}
for (Record record: duplicates) {
    // Handle duplicate once:
    ...
}