【问题标题】:When I use Collections.sort on an array list of my custom made objects the order is not retained当我在自定义对象的数组列表上使用 Collections.sort 时,不会保留顺序
【发布时间】:2017-10-02 18:17:18
【问题描述】:

我已经制作了一些具有整数属性的对象,该属性依赖于另一个类生成的另一个对象。我还制作了一个比较器,根据该属性在ArrayList 中对它们进行排序。但是,当我使用此比较器进行排序时,它似乎会立即恢复到初始顺序。这是一个使用我编写的比较器的狗和品种的示例:

    public static Comparator<Breed> BreedSizeComparator = new Comparator<Breed>() {
    @Override
    public int compare(Breed o1, Breed o2) {

        int pos1 = o1.getBreedSize();
        int pos2 = o2.getBreedSize();

        return pos1 - pos2;
    }
};

然后我尝试创建一个总是返回第二大品种的方法:

public static Party getSecBigBreed() {
    Collections.sort(breeds, BreedSizeComparator);
    return breeds.get(1);
}

当我调用它时,虽然我得到了最初位于数组列表中位置 1 的品种(在我进行排序之前)。从我所做的研究来看,这似乎与我将创建的所有品种的数组列表作为品种的类变量这一事实有关。例如。 Breed 类是这样的:

public class Breed {
private int size = 0;
private int type;
private static ArrayList<Breed> breeds = new ArrayList<Breed>();

public Breed(int type0) {
    type = type0;
    breeds.add(this);
}

我还在这个品种类中创建了一个方法,将一个添加到我每次制作该类型狗时使用的大小,另一个根据其类型获取品种,以及获取方法品种大小:

public void increaseSize() {
    this.Size++;
}

public static Breed getBreed(int type0) {
    for(int i = 0; i < breeds.size(); i++) {
         if(type0 = breeds.get(i).type) {
              return breeds.get(i);
         }
    }
}

public int getBreedSize() {
    return size;
}

这是我的狗类:

public class Dog {
private int type;
private int dogNumber;
private static ArrayList<Dog> dogs = new ArrayList<Dog>();

public Dog(int type0) {
    type = type0;
    getBreed(type).increaseSize();
}

真的不明白为什么当我根据品种的大小对ArrayList 品种进行排序时,它会恢复到原始排序。

【问题讨论】:

  • "if(type0 = breeds.get(i).type) {" 并且循环后没有返回意味着此代码无法编译。请发帖minimal reproducible example
  • 遵循您的代码真的很难,而且很难隔离问题。我建议您使用调试器并逐步执行代码以找到罪魁祸首。如果订单确实回落(private static ArrayList&lt;Breed&gt; breeds 看起来像是在这里看到的臭候选人,尤其是当您有很多 Dog/Breed 实例时),您会立即看到它逐步通过。

标签: java sorting arraylist


【解决方案1】:

仍然在看所有东西,但只有一件事让我印象深刻:

    public static Comparator<Breed> BreedSizeComparator = new Comparator<Breed>() {
    @Override
    public int compare(Breed o1, Breed o2) {

        int pos1 = o1.getBreedSize();
        int pos2 = o2.getBreedSize();

        return pos1 - pos2;
    }
};

我不知道这些值是什么,但重要的是要注意比较的工作原理:

比较它的两个参数的顺序。返回一个负整数, 零或正整数,因为第一个参数小于、等于 到或大于第二个。在前面的描述中, 符号 sgn(expression) 表示数学符号函数, 它被定义为根据是否返回 -1、0 或 1 之一 表达式的值为负、零或正。

因此,如果 pos1 和 pos2 都是负数、正数或相等,您可能会看到列表中出现意外甚至没有移动

我会建议以下几点:

public static Comparator<Breed> BreedSizeComparator = new Comparator<Breed>() {
    @Override
    public int compare(Breed o1, Breed o2) {

        int pos1 = o1.getBreedSize();
        int pos2 = o2.getBreedSize();

        if (pos1 > pos2) {
            return 1;
        } else if (pos2 > pos1) {
            return -1;
        } else {
            return 0;
        }
    }
};

编辑: 正如 Thomas Jungblut 指出的,一个更简单的解决方案是:

public static Comparator<Breed> BreedSizeComparator = new Comparator<Breed>() {
    @Override
    public int compare(Breed o1, Breed o2) {

        int pos1 = o1.getBreedSize();
        int pos2 = o2.getBreedSize();

        return Integer.valueOf(pos1).compareTo(pos2);
    }
};

'compareTo' 的作用是在两个值相等时返回 0,如果第一个参数小于第二个参数则返回负值,如果第一个参数大于第二个参数则返回正值。

【讨论】:

  • Integer.compare(o1.getBreedSize(), o2.getBreedSize()) 使它更容易。 docs.oracle.com/javase/7/docs/api/java/lang/…
  • 非常真实!我只是想展示一个场景,展示如何返回值。我会更新我的答案
  • 毫无疑问!如果您想寻找最容易消化的方法,使用 lambdas 您可以编写 Collections.sort(breeds, (l, r) -&gt; Integer.compare(l.getBreedSize(), r.getBreedSize())); Autoboxing 应该可以为您节省 valueOf 调用。
  • 我是一名 android 开发人员,我工作的公司对 3rd 方库(如 retrolamda)非常严格。所以lamdas在我的生活中不存在:P
  • 我写的比较器工作正常,但是当我需要降序时它给了我升序。
【解决方案2】:

比较器需要反过来:

public static Comparator<Breed> BreedSizeComparator = new Comparator<Breed>() {
@Override
public int compare(Breed o1, Breed o2) {

    int pos1 = o1.getBreedSize();
    int pos2 = o2.getBreedSize();

    //return pos1 - pos2;

    //ArrayList needs to be in descending order
    return pos1 - pos2;
}
};

【讨论】:

    猜你喜欢
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    相关资源
    最近更新 更多