gpt4 book ai didi

java - 有效地比较Java中的两个对象列表

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:01:47 24 4
gpt4 key购买 nike

我目前正在查看两个非常大的 Peak 对象列表,通过覆盖 equals 方法并循环遍历两个列表,将每个峰值与其他每个峰值进行比较.有没有更有效的方法来做到这一点?我的列表可以包含约 10,000 个元素,这意味着最多 10000 * 10000 次比较。

我的 peak 对象的代码:

public class Peak extends Object{

private final SimpleIntegerProperty peakStart;
private final SimpleIntegerProperty peakEnd;
private final SimpleIntegerProperty peakMaxima;
private final SimpleIntegerProperty peakHeight;
private final SimpleIntegerProperty peakWidth;
private final SimpleStringProperty rname;

public Peak(int peakStart, int peakEnd, int peakMaxima, int peakHeight, String rname) {
this.peakStart = new SimpleIntegerProperty(peakStart);
this.peakEnd = new SimpleIntegerProperty(peakEnd);
this.peakMaxima = new SimpleIntegerProperty(peakMaxima);
this.peakHeight = new SimpleIntegerProperty(peakHeight);
this.peakWidth = new SimpleIntegerProperty(peakEnd - peakStart);
this.rname = new SimpleStringProperty(rname);
}

public String getRname() {
return rname.get();
}

public SimpleStringProperty rnameProperty() {
return rname;
}

public int getPeakWidth() {
return peakWidth.get();
}

public int getPeakHeight() {
return peakHeight.get();
}

public int getPeakStart() {
return peakStart.get();
}

public int getPeakEnd() {
return peakEnd.get();
}

public int getPeakMaxima() {
return peakMaxima.get();
}

@Override
public String toString() {
return "Peak{" +
"peakStart= " + peakStart.get() +
", peakEnd= " + peakEnd.get() +
", peakHeight= " + peakHeight.get() +
", rname= " + rname.get() +
'}';
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;

Peak peak = (Peak) o;

if (!peakMaxima.equals(peak.peakMaxima)) return false;
return rname.equals(peak.rname);
}

@Override
public int hashCode() {
int result = peakMaxima.hashCode();
result = 31 * result + rname.hashCode();
return result;
}
}

我用于比较对象的循环就在这里。

 List<Peak> interestingPeaks = new ArrayList<>();

if(peakListOne != null && peakListTwo != null){
for(Peak peak : peakListOne){
for(Peak peak2 : peakListTwo){
if(peak.equals(peak2)){ //number one, check the rnames match
if((peak2.getPeakHeight() / peak.getPeakHeight() >= 9) || (peak.getPeakHeight() / peak2.getPeakHeight() >= 9)){
interestingPeaks.add(peak);
}
}
}
}
}

return interestingPeaks;

代码基本上匹配最大值的位置和 rname ,它只是一个字符串。如果一个峰的高度比另一个高 9 倍,则将峰附加到 interestingPeaks 列表。

最佳答案

请注意,如果两个列表按最大值和名称排序,您可以简单地对两个列表进行一次线性传递,并并排比较项目。如果这两个列表实际上完全相等,那么您永远不会从这两个列表中找到不相等的一对。

List<Peak> p1;
List<Peak> p2;

p1.sort((p1, p2) -> {
int comp = Integer.compare(p1.getPeakMaxima(), p2.getPeakMaxima());
return comp != 0 ? comp : p1.getRname().compareTo(p2.getRname());
});

// and also sort the second list

现在我们可以遍历两个列表并检查比较是否失败:

for (int i=0; i < p1.size(); ++i) {
if (!p1.get(i).equals(p2.get(i))) {
System.out.println("peaks are not equal");
break;
}
}

这将 O(N^2) 操作减少为 O(N*lgN),这是执行两种排序的惩罚(最后的遍历列表的下方是 O(N),并且无论使用哪种方法都可以忽略不计。

关于java - 有效地比较Java中的两个对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49856036/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com