java - 比较对象数组元素中的特定属性
问题描述
我有一组乘客如下:
Passenger[] passengers = new Passenger[5];
这是乘客的定义:
public class Passenger{
int id;
int fromId;
int toId;
}
我想找到“to”和“from”属性匹配的乘客;例如,如果 John 的 fromID = 3,而 Jerry 的 toID = 3,那么我可以将它们放在一起并将它们添加到“pairedPassengers”列表中。我已经有如下的 O(n^2) 解决方案,但是更有效的方法是什么?
public class PairedPassengers{
int id1;
int id2;
}
public class MainClass{
public static void main(String[] args){
List<PairedPassengers> pairedPassengers = new ArrayList<PairedPassengers>();
for (int i=0; i<passengers.length(); i++){ //length of the original array with all data
for (int j=i; j<passengers.length(); j++){
if (passengers[i].fromId == passengers[j].toId && passengers[i].toId == passengers[j].fromId){
PairedPassengers pPassengers = new PairedPassengers(); //creating a new object to put pairing passengers into
pPassengers.id1 = passengers[i].id;
pPassengers.id2 = passengers[j].id;
pairedPassengers.add(pPassengers);
}
}
}
}
}
解决方案
使用 a按他们的领域Map
查找 a 。a 上的和方法都是 O(1) 时间,因此该算法的总体复杂度为 O(n)。Passenger
to
get
put
HashMap
Map<Integer, Passenger> to = new HashMap<>();
for(Passenger p : passengers) {
to.put(p.toId, p);
}
List<PairedPassengers> paired = new ArrayList<>();
for(Passenger q : passengers) {
Passenger p = to.get(q.fromId);
if(p != null) {
paired.add(new PairedPassengers(p, q));
}
}
您还应该为PairedPassengers
该类编写一个合适的构造函数。
我在这里假设每个乘客都应该以独特的方式与其他乘客配对,因此没有重复to
或from
字段。如果有这样的重复项,那么您将需要Map<Integer, List<Passenger>>
存储具有每个to
值的乘客列表。解决方案在最好的情况下仍然是 O(n) 时间,但在最坏的情况下将是 O(n²),因为可以找到二次数的对。
推荐阅读
- visual-studio - @inherhits 在 ASP.NET Core 3.1 的剃刀文件中
- amcharts - amCharts 长图例名称不右对齐
- oracle - 执行 PL/SQL 块会出现无法理解的错误
- selenium - Selenium Chrome 驱动程序 - 我可以设置连接驱动程序的超时时间吗?
- javascript - 在 javascript 函数中使用输入值
- reactjs - 自定义分页和过滤在反应 js 中不起作用
- javascript - 更改 openlayers 地图颜色(深色和浅色样式)
- c# - 如何将用户重定向到本地登录,然后再重定向到 IdentityServer?
- datepicker - SwiftUI:DatePicker 是否可以在当前的其他时区显示日期/时间?
- ionic-framework - 如何在 Ionic 上创建自定义 SplashScreen?