我创建了一些具有整数属性的对象,该属性依赖于另一个类生成的另一个对象。我还根据该属性制作了一个比较器,用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
品种进行排序时,它会恢复原来的顺序。
答案 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;
}
};