Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.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_Algorithm - Fatal编程技术网

Java 在没有嵌套循环的列表中查找重复项?

Java 在没有嵌套循环的列表中查找重复项?,java,algorithm,Java,Algorithm,我目前正在做一项作业,我必须优化一些代码。最慢的方法之一是在列表中查找重复元素的方法 场景中的副本的工作方式如下: 假设您有一个元素列表,每个元素有两个ID,x和y。每个x值只能与一个y值配对,否则将其计为重复值,并且必须将原始值和重复值添加到列表中 例如,元素列表为(1,2)(1,2)(1,3) 在本例中,副本列表将包含4个元素,(1,2)(1,3)和(1,2)(1,3),因为它们都具有相同的x值,但具有不同的y值。 (1,2)(1,2)不会被归类为重复项,因为x和y值是相同的 当前代码使用嵌

我目前正在做一项作业,我必须优化一些代码。最慢的方法之一是在列表中查找重复元素的方法

场景中的副本的工作方式如下: 假设您有一个元素列表,每个元素有两个ID,x和y。每个x值只能与一个y值配对,否则将其计为重复值,并且必须将原始值和重复值添加到列表中

例如,元素列表为(1,2)(1,2)(1,3) 在本例中,副本列表将包含4个元素,(1,2)(1,3)和(1,2)(1,3),因为它们都具有相同的x值,但具有不同的y值。 (1,2)(1,2)不会被归类为重复项,因为x和y值是相同的

当前代码使用嵌套的for循环,该循环检查两个元素的x值是否相等,但y值是否不同,但速度非常慢

在实际场景中,元素是与患者匹配的肾脏捐赠者。所以每个捐赠者只能向一个病人捐赠。X和Y是表示患者和捐赠者ID的字符串


如果有人知道一种更快的方法,我们将不胜感激:)

您可以使用一组整数:

Set<List<Integer>> uniqueIds = new HashSet(listOfIds)
Set uniqueid=newhashset(listOfIds)

这项工作由hashset构造函数完成。

您可以使用x值作为排序标准对对数组进行排序。 然后将数组切片为具有相同x值的较小数组。
然后使用当前算法,仅在较小的块中局部查找重复项。虽然它仍然有嵌套循环,但执行速度会更快,因为搜索仅限于小数组,当n是元素数时,使用两个嵌套循环的搜索的复杂性为O(n*n)。

我只是给你一个提示 将其视为一个图形问题,并在(u,v)和(u,v)之间绘制一条边。如果发现指向v的n条边是重复的,则可以尝试以下操作:

Map<Integer, Map<Integer, Long>> mmap = linkTable.stream()
      .collect(groupingBy(DonorsToPatientPair::getDonorID,
            groupingBy(DonorsToPatientPair::getPatientID, counting())));
要处理地图,可以使用以下代码:

long freq = mmap.get(d).get(p)
for (int donor : mmap.keySet()) {
  Map<Integer, Long> patientMap = mmap.get(donor);
  if (patientMap.size() < 2) {
    continue; // no duplicates
  }
  // *** your code here ***
}
for(int施主:mmap.keySet()){
Map patientMap=mmap.get(供体);
if(patientMap.size()<2){
continue;//没有重复项
}
//***请在此处输入您的代码***
}

对于您自己的代码,您有一个循环中的捐赠者和一个从患者到他们频率的映射。剩下的工作应该很容易完成。

使用。A.
Map
。把所有的东西都扔到地图上,所有的工作都会为你完成。把代码显示出来作为参考,那么我该如何实现呢?我需要返回一个对象列表,ID实际上存储为字符串。到目前为止,我有这样一个:
setuniqueids=newhashset();对于(DonorStorPatientPair捐赠者:linkTable){if(!uniqueIds.add(新对(捐赠者.getDonorID(),捐赠者.getPaientID()){results.add(捐赠者);}}}
Rawtypes不正确-永远不要使用Rawtypes。此外,这并不能解决问题。谢谢,我设法让它工作了。最终比原始代码快约95%。)