如何根据两个参数对对象列表进行排序以在Java上进行比较?

| 我有一个这样的课:
public class Zern extends Something{
 private int costA;
 private int costB;

 public int getcostA() {
     return costA;
 }

 public void setcostA(int costA) {
     this.costA = costA;
 }

 public int getcostB() {
     return costB;
 }

 public void setcostB(int costB) {
     this.costB = costB;
 }
}
我有一个包含此类对象的列表:
private List<Zern> zerns = new ArrayList<Zern>(MAX_ZERN_SIZE);
我将新对象添加到我的列表中,但是我始终希望根据成本a有一个有序列表,如果列表中有一个对象与我要添加的对象具有相同的成本,我想根据该对象添加该对象他们的成本 我的意思是:
Index of objects at list   0    1    2    3    4   5
CostA                     10   15   22   22   25  36
CostB                     26   12   17   19   23  44

If I want to add an object that has a costA 22 and costB 18, 
it will locate at index 3.
如何使用Comparator或类似方法有效地做到这一点(因为我将一个对象添加到排序列表中,这意味着我可以使用二进制搜索-如果可能我想根据此找到解决方案)?     
已邀请:
Collections.sort
与以下比较器一起使用:
Collections.sort(zerns, new Comparator<Zern>() {

    @Override
    public int compare(Zern z1, Zern z2) {
        if (z1.getcostA() == z2.getcostA()) {
            return z1.getcostB() == z2.getcostB() ? 0 : 
                z1.getcostB() < z2.getcostB() ? -1 : 1;
        } else {
            return z1.getcostA() < z2.getcostA() ? -1 : 1;
        }
    }
});
更新:如果您不需要对项目进行索引访问,则可能首先需要使用自定义比较器的排序集实现:
TreeSet<Zern> zerns = new TreeSet<Zern>(new Comparator<Zern>() {

    @Override
    public int compare(Zern z1, Zern z2) {
        if (z1.getcostA() == z2.getcostA()) {
            return z1.getcostB() == z2.getcostB() ? 0 : 
                z1.getcostB() < z2.getcostB() ? -1 : 1;
        } else {
            return z1.getcostA() < z2.getcostA() ? -1 : 1;
        }
    }
});
现在可以添加对象,并且您的集合将始终保持排序状态(注意:我在Zern类中添加了一个构造函数和toString):
zerns.add(new Zern(10, 26));
System.out.println(zerns);     // => [(10,26)]
zerns.add(new Zern(22, 19));
System.out.println(zerns);     // => [(10,26), (22,19)]
zerns.add(new Zern(22, 17));
System.out.println(zerns);     // => [(10,26), (22,17), (22,19)]
zerns.add(new Zern(15, 12));
System.out.println(zerns);     // => [(10,26), (15,12), (22,17), (22,19)]
您可以删除一个项目
zerns.remove(new Zern(22, 17));
System.out.println(zerns);     // => [(10,26), (15,12), (22,19)]
或删除成本最低的项目
zerns.remove(zerns.last());
System.out.println(zerns);     // => [(10,26), (15,12)]
或通过以下方式获得成本最高的商品
System.out.println(zerns.first());    // => (10,26)
    
只需比较第一个条件即可。如果它们匹配,则比较第二个条件:
public int compareTo(Zern other) {
   final int result;

    if (this.costA == other.costA) {
        if (this.costB > other.costB) {
            result = 1;
        } else if (this.costB < other.costB) {
            result = -1;
        } else {
            result = 0;
        }
    } else {
        if (this.costA > other.costA) {
            result = 1;
        } else if (this.costA < other.costA) {
            result = -1;
        } else {
            result = 0;
        }
    }

    return result;
}
    

要回复问题请先登录注册