2014-10-06 13 views
5

Tôi đã kiểm tra post muốn biết cách sử dụng ComparatorCam quả là lần đầu tiên. Từ phương pháp bài toString đã mất tích vì vậy tôi thêm vào mã của tôiArrays.parallelSort vs Collections.sort

@Override 
public String toString(){ 
    return fruitName +" " + fruitDesc; 
} 

Câu trả lời cho các bài đã

sử dụng 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()); 
     } 
    }); 

đầu ra:

Orange Orange description 
Apple Apple description 
Banana Banana description 
Pineapple Pineapple description 

Tôi đã suy nghĩ tại sao không Arrays.parallelSort mà tôi đã được cho biết những thứ tốt về

read more here

sử dụng Arrays.parallelSort đang

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()); 
    }); 

đầu ra:

Pineapple Pineapple description 
Apple Apple description 
Orange Orange description 
Banana Banana description 

The link to the post is here

Để sắp xếp của tôi sắp xếp, tại sao lại có phương thức khác nhau?

+0

thực hiện các [link1] này (http://stackoverflow.com/questions/17328077/difference-between-arrays-sort-and-arrays-parallelsort) và [link2] (http://java.dzone.com/ bài viết/arrayssort-versus) giúp bạn. –

+0

@ ankur-singhal cảm ơn bạn nhưng tôi đã kiểm tra đã –

+0

@KickButtowski: Bạn có chắc là bạn đã chạy chương trình một cách chính xác chưa. Bất kể thứ tự mà tôi nhập các giá trị, 'Orange' được đặt trước. –

Trả lời

4

Nếu một chương trình chạy trong TryJava8, tôi sẽ nhận được mảng được sắp xếp chính xác. Tôi nghĩ rằng bạn có thể in đầu vào (fruits) thay vì đầu ra (arrayFruits). Điều này nói rằng, bạn đã mở một chủ đề thú vị, vì nói chung, bạn đúng một thuật toán sắp xếp không đảm bảo thứ tự đầy đủ. Nói chung đối với mảng lớn, nếu hai phần tử là tương đương, nhưng không giống nhau (ví dụ một con trỏ khác với một bản ghi tương đương), các thuật toán không đảm bảo một thứ tự cụ thể. Điều này nói rằng quan hệ nói chung bị phá vỡ khác nhau bởi các thuật toán khác nhau.

Một so sánh phương pháp nên đáp ứng những ràng buộc trật tự liên quan:

Một mối quan hệ thứ tự nên là:

  • phản: tất cả các mục cần được bình đẳng với chính nó (bạn tốt hơn trở 0 tôi đoán)
  • không đối xứng: nếu A nhỏ hơn hoặc bằng BB nhỏ hơn hoặc bằng A, AB bằng nhau.
  • bắc cầu: nếu Một là nhỏ hơn hoặc bằng BB là nhỏ hơn hoặc bằng C, Một là nhỏ hơn hoặc bằng C.

Hầu hết các thuật toán sắp xếp giả định ràng buộc này một cách ngầm định (chúng không kiểm tra chúng) và do đó cung cấp độ phức tạp thời gian O (n log n). Nếu điều kiện không giữ, tùy thuộc vào việc thực hiện thuật toán, một điều kiện sẽ thu được các kết quả khác nhau.

Vì sắp xếp song song sử dụng thuật toán MergeSort và loại mặc định sử dụng thuật toán QuickSort, hai thuật toán có hành vi khác nhau.

Chủ đề có liên quan: hầu hết các thuật toán sắp xếp không ổn định. Giả sử hai mục là "bình đẳng", sau đó nó không được bảo đảm rằng nếu Một đã được đặt trước A ' trong mảng ban đầu, Một sẽ được đặt trước A' trong mảng kết quả.

+0

kết quả phải giống nhau. dựa trên bài đăng, màu cam phải là lần đầu tiên tất cả thời gian –

+0

+1 cho thông tin tuyệt vời –

+1

Được rồi, nhưng lưu ý rằng đối với mảng lớn, các mục "tương đương" (nhưng không giống nhau, ví dụ: một con trỏ khác) được xáo trộn ... –

Các vấn đề liên quan