首页 / JAVA / 高效比较Java中的两个对象列表
高效比较Java中的两个对象列表
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了高效比较Java中的两个对象列表,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3055字,纯文字阅读大概需要5分钟。
内容图文
![高效比较Java中的两个对象列表](/upload/InfoBanner/zyjiaocheng/686/316f9b739d9849b6814b3ed4bdb53395.jpg)
我目前正在遍历两个非常大的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<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匹配,rname只是一个字符串.然后,如果一个峰的高度比另一个峰高9倍,则将该峰追加到有趣的峰列表中.
解决方法:
赞赏的是,如果两个列表是按最大值和名称排序的,则可以简单地沿两个列表进行一次线性传递,并比较各个项目.如果两个列表实际上完全相等,那么您将永远不会从两个不相等的列表中找到一对.
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中的两个对象列表所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。