java实现两个对象比较_高效比较Java中的两个对象列表

我目前正在遍历两个非常大的Peak Objects列表,方法是覆盖equals方法并遍历这两个列表,将每个峰与每个其他峰进行比较.有更有效的方法吗?我的列表可以是10,000个元素,这意味着最多10000 * 10000个比较.

我的峰值对象的代码:

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 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匹配,rname只是一个字符串.然后,如果一个峰的高度比另一个峰高9倍,则将该峰追加到有趣的峰列表中.

解决方法:

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

List p1;

List 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),并且两种方法都可以忽略不计) .

标签:performance,java

来源: https://codeday.me/bug/20191025/1927037.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值