我正在检查一个post,想要知道如何使用Comparator
和橙色水果一直是第一个。从帖子toString方法丢失所以我添加到我的代码
@Override
public String toString(){
return fruitName +" " + fruitDesc;
}
该帖子的答案是
使用Collection.sort
Collections.sort(fruits, new Comparator<Fruit>() {
@Override
public int compare(Fruit o1, Fruit o2) {
if (o1.getFruitName() != null && o1.getFruitName().equalsIgnoreCase("orange")){
return -1;
}
if (o2.getFruitName() != null && o2.getFruitName().equalsIgnoreCase("orange")){
return 1;
}
return o1.getFruitName().compareTo(o2.getFruitName());
}
});
输出:
Orange Orange description
Apple Apple description
Banana Banana description
Pineapple Pineapple description
我在想为什么Arrays.parallelSort
我被告知好的事情
使用Arrays.parallelSort
代码
Fruit[] arrayFruits = fruits.stream().toArray(Fruit[]::new);
Arrays.parallelSort(arrayFruits, (Fruit o1, Fruit o2) -> {
if (o1.getFruitName() != null && o1.getFruitName().equalsIgnoreCase("orange")){
return -1;
}
if (o2.getFruitName() != null && o2.getFruitName().equalsIgnoreCase("orange")){
return 1;
}
return o1.getFruitName().compareTo(o2.getFruitName());
});
输出:
Pineapple Pineapple description
Apple Apple description
Orange Orange description
Banana Banana description
对我来说排序是排序,为什么不同的答案形成不同的方法?
答案 0 :(得分:4)
如果在TryJava8中运行程序,我会得到正确排序的数组。我想你可能打印输入(fruits
)而不是输出(arrayFruits
)。这就是说,你开了一个有趣的话题,因为一般来说,你是对的,排序算法并不能保证完整的顺序。通常对于大型数组,如果两个元素是等效的,但不相同(例如,指向等效记录的不同指针),则算法不保证特定的顺序。这种说法通常会因不同的算法而有所不同。
比较方法应满足顺序关系约束:
订单关系应为:
0
我猜)大多数排序算法都隐含地假设这些约束(它们不检查它们),因此提供 O(n log n)时间复杂度。如果条件不成立,则根据算法的实现,可以获得不同的结果。
由于并行排序使用MergeSort
算法,并且默认排序使用QuickSort
算法,因此这两种算法具有不同的行为。
相关主题:大多数排序算法不稳定。假设两个项目是&#34;相等&#34;,则无法保证如果 A 放在原始数组中 A&#39; 之前, 将放在结果数组中 A&#39; 之前。