比较对象数组中元素的特定属性

时间:2019-11-26 20:42:11

标签: java data-structures

我有一系列乘客,如下:

Passenger[] passengers = new Passenger[5];

以下是“乘客”的定义:

public class Passenger{
    int id;
    int fromId;
    int toId;
}

我想找到“ to”和“ from”属性匹配的乘客;例如,如果John的fromID = 3,而Jerry的toID = 3,那么我可以将它们放在一起并将它们添加到“ pairedPassengers”的 List 中。我已经有一个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);
       }
      }
    }
 }
}

1 个答案:

答案 0 :(得分:2)

使用Map通过其Passenger字段查找toget上的putHashMap方法均为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²),因为可以找到二次对。