Arrays.parallelSort vs Collections.sort

时间:2014-10-06 06:17:50

标签: java sorting java-8

我正在检查一个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我被告知好的事情

read more here

使用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

The link to the post is here

对我来说排序是排序,为什么不同的答案形成不同的方法?

1 个答案:

答案 0 :(得分:4)

如果在TryJava8中运行程序,我会得到正确排序的数组。我想你可能打印输入(fruits)而不是输出(arrayFruits)。这就是说,你开了一个有趣的话题,因为一般来说,你是对的,排序算法并不能保证完整的顺序。通常对于大型数组,如果两个元素是等效的,但不相同(例如,指向等效记录的不同指针),则算法不保证特定的顺序。这种说法通常会因不同的算法而有所不同。

比较方法应满足顺序关系约束

订单关系应为:

  • 反身:每个项目都应该等于自己(你最好回复0我猜)
  • 非对称:如果 A 小于或等于 B B 小于或等于 A A B 相等。
  • 传递:如果 A 小于或等于 B B 小于或等于 C A 小于或等于 C

大多数排序算法都隐含地假设这些约束(它们不检查它们),因此提供 O(n log n)时间复杂度。如果条件不成立,则根据算法的实现,可以获得不同的结果。

由于并行排序使用MergeSort算法,并且默认排序使用QuickSort算法,因此这两种算法具有不同的行为。

相关主题:大多数排序算法不稳定。假设两个项目是&#34;相等&#34;,则无法保证如果 A 放在原始数组中 A&#39; 之前, 将放在结果数组中 A&#39; 之前。