Java Arrays.parallelSort与Collections.sort
我正在检查一个想知道如何使用Java Arrays.parallelSort与Collections.sort,java,sorting,java-8,Java,Sorting,Java 8,我正在检查一个想知道如何使用比较器的水果和一个橙色的水果。缺少post-toString方法,因此我将其添加到代码中 @Override public String toString(){ return fruitName +" " + fruitDesc; } 对这篇文章的回答是 使用集合。排序 Collections.sort(fruits, new Comparator<Fruit>() { @Override public int
比较器的水果和一个橙色的水果。缺少post-toString方法,因此我将其添加到代码中
@Override
public String toString(){
return fruitName +" " + fruitDesc;
}
对这篇文章的回答是
使用集合。排序
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());
}
});
我在想为什么不Arrays.parallelSort
,我已经听说了关于它的好消息
使用数组。并行排序
code
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());
});
输出:
Orange Orange description
Apple Apple description
Banana Banana description
Pineapple Pineapple description
Pineapple Pineapple description
Apple Apple description
Orange Orange description
Banana Banana description
对我来说,排序就是排序,为什么不同的答案来自不同的方法?如果在中运行程序,我会得到正确排序的数组。我认为您可能打印了输入(水果
),而不是输出(数组水果
)。这就是说,你打开了一个有趣的话题,因为总的来说,你是对的,排序算法不能保证完整的顺序。通常,对于大型数组,如果两个元素是等效的,但不相同(例如指向等效记录的不同指针),则算法不能保证特定的顺序。这表明,不同的算法通常会以不同的方式打破联系
比较方法应满足顺序关系约束:
Orange Orange description
Apple Apple description
Banana Banana description
Pineapple Pineapple description
Pineapple Pineapple description
Apple Apple description
Orange Orange description
Banana Banana description
订单关系应为:
- 自反:每个项目都应该等于它本身(我想你最好返回
0
0)
- 不对称:如果A小于或等于B且B小于或等于A,则A和B相等
- 及物性:如果A小于或等于B且B小于或等于C,则A小于或等于C
大多数排序算法都隐式地假设了这个约束(它们不检查约束),因此提供了O(nlogn)时间复杂度。如果条件不成立,则根据算法的实现情况,会得到不同的结果
由于并行排序使用MergeSort
算法,而默认排序使用QuickSort
算法,因此这两种算法具有不同的行为
相关话题:大多数排序算法都不稳定。假设两个项目“相等”,则不能保证如果在原始数组中A放在“A”之前,那么在生成的数组中A将放在“A”之前。这样做对您有帮助。@ankur singhal谢谢您,但我已经检查过了already@KickButtowski:您确定程序运行正确吗。不管我输入值的顺序如何,Orange
都放在第一位。@Ya我确信你看到了我的postSame:无法复制它。橙色是第一位的,结果必须是一样的。根据帖子,橙色必须始终是第一个,好吧,但请注意,对于大型数组,可以对“等效”(但不相同,例如不同的指针)的项进行洗牌…非常感谢您的回答,这帮了大忙谢谢:)默认值不使用快速排序
,因为快速排序
不是一个稳定的算法和集合。排序
保证是稳定的<代码>快速排序
可用于排序稳定性无意义的情况,例如,对数组等数字进行排序时。排序(int[])可以。值得注意的是,问题的比较器确实违反了比较器
的约定,因为它没有正确处理两个元素名称均为“orange”
的情况。