[英]Comparing specific properties in elements of an array of objects
我有一系列乘客如下:
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);
}
}
}
}
}
使用Map
通過其to
字段查找Passenger
。 HashMap
上的get
和put
方法都是 O(1) 時間,因此該算法的整體復雜度為 O(n)。
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²),因為可以找到平方數的對。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.