簡體   English   中英

比較對象數組元素中的特定屬性

[英]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上的getput方法都是 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類編寫一個合適的構造函數。

我假設在這里,每位乘客應該只有一個以一種獨特的方式與其他乘客配對,所以有沒有重復tofrom場。 如果有這樣的重復,那么您將需要一個Map<Integer, List<Passenger>>存儲乘客的名單,每個to的價值。 在最好的情況下,解決方案仍然是 O(n) 時間,但在最壞的情況下它將是 O(n²),因為可以找到平方數的對。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM