Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Arrays.parallelSort与Collections.sort_Java_Sorting_Java 8 - Fatal编程技术网

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”
的情况。