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

标签 java list arraylist binary-search comparator

我有一个这样的类:

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 排序的列表,如果列表中有一个对象与我要添加的对象具有相同的成本,我想添加它根据他们的成本反对 B.

我的意思是:

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)

关于java - 如何根据两个参数对对象列表进行排序以在 Java 中进行比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5778433/

相关文章:

java - 如何找到其中包含空元素的整数数组的最大元素的索引?

java - GWT - DecoratorPanel - 动态背景色

arrays - PowerShell 枚举一个只包含一个内部数组的数组

c# - 将列表创建的字典从 Python 转换为 C#

java - 如何将数据从 XML 文件添加到 ArrayList

java - 如何将字符串数组的 ArrayList 转换为二维字符串数组

java - java是一种开源编程语言吗?

java - 如何将 List<Complex> 打印为 x+iy 格式的数组 [ 使用 Apache Common Math - Complex ]

java - 是否可以在 liferay 中创建没有请求对象的呈现 URL?

python - 我需要比较两个列表并检查 list1 中的字符串是否在 list2 中