当我在自定义对象的数组列表上使用Collections.sort时,不保留顺序

时间:2017-10-02 18:17:19

标签: java sorting arraylist

我创建了一些具有整数属性的对象,该属性依赖于另一个类生成的另一个对象。我还根据该属性制作了一个比较器,用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);
}

当我打电话给这个时虽然我最初得到了arraylist中位置1的品种(在我进行排序之前)。从我所做的研究来看,似乎它可能与我把所有品种的arraylist作为品种的变量创建的事实有关。例如。品种是这样的:

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品种进行排序时,它会恢复原来的顺序。

2 个答案:

答案 0 :(得分: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(表达式)表示数学符号函数,   它被定义为根据是否返回-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);
    }
};

what&#39; compareTo&#39;如果两个值相等,则返回0;如果第一个参数小于第二个,则返回负值;如果第一个参数大于第二个参数,则返回正值。

答案 1 :(得分:0)

比较器需要相反:

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;
}
};