Java 在没有嵌套循环的列表中查找重复项?
我目前正在做一项作业,我必须优化一些代码。最慢的方法之一是在列表中查找重复元素的方法 场景中的副本的工作方式如下: 假设您有一个元素列表,每个元素有两个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的字符串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值是相同的 当前代码使用嵌
如果有人知道一种更快的方法,我们将不胜感激:)您可以使用一组整数:
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%。)