2015-01-17 19 views
8

Tôi muốn sắp xếp ArrayList bằng cách sử dụng kiểu boolean. Về cơ bản tôi muốn hiển thị các mục nhập với số true trước tiên. Đây là mã của tôi dưới đây:Sắp xếp một ArrayList theo kiểu boolean nguyên thủy

Abc.java

public class Abc { 
int id; 
bool isClickable; 

Abc(int i, boolean isCl){ 
    this.id = i; 
    this.isClickable = iCl; 
} 
} 

Main.java

List<Abc> abc = new ArrayList<Abc>(); 

//add entries here 

//now sort them 
Collections.sort(abc, new Comparator<Abc>(){ 
     @Override 
     public int compare(Abc abc1, Abc abc2){ 

      boolean b1 = abc1.isClickable; 
      boolean b2 = abc2.isClickable; 

      if (b1 == !b2){ 
       return 1; 
      } 
      if (!b1 == b2){ 
       return -1; 
      } 
      return 0; 
     } 
    }); 

thứ tự trước khi sắp xếp: đúng đúng đúng sai sai sai f alse đúng sai sai

thứ tự sau khi phân loại: sai sai đúng đúng đúng đúng sai sai sai sai

+2

nếu chúng là '==' return 0. Nếu chúng là '! =', Thì hãy sử dụng 1 hoặc -1 dựa trên việc đầu tiên là đúng hay sai. –

+2

Điều kiện 'if' thứ hai của bạn sẽ không bao giờ đánh giá thành' true'. Nó đồng nghĩa với cái đầu tiên. – 5gon12eder

+0

bạn cần xác định loại bạn cần, có liên quan đến id không? – roeygol

Trả lời

3

Một gợi ý đơn giản sẽ được sử dụng đối tượng Boolean thay của boolean và sử dụng Collections.sort.

Tuy nhiên, bạn phải biết rằng false sẽ ở trước true vì đúng được thể hiện là 1 và sai là 0. Nhưng sau đó, bạn chỉ có thể thay đổi thuật toán và truy cập theo thứ tự ngược lại.

Chỉnh sửa: Như soulscheck đã nêu, bạn có thể sử dụng Collections.reverseOrder để hoàn nguyên đơn đặt hàng do Bộ so sánh áp đặt.

10

Trong trường hợp này, một trong những giải pháp dễ nhất là chuyển booleans thành số nguyên, trong đó false0true1. Sau đó trả lại sự khác biệt của cái thứ hai và cái thứ nhất.

Vì vậy:

 int b1 = abc1.isClickable ? 1 : 0; 
     int b2 = abc2.isClickable ? 1 : 0; 

     return b2 - b1 

nên làm điều đó.

4

Tôi muốn các mục có giá trị true xuất hiện trước tiên. Giải pháp của tôi sẽ là:

Collections.sort(m_mall, new Comparator<Mall>(){ 

     @Override 
     public int compare(Mall mall1, Mall mall2){ 

      boolean b1 = mall1.isClickable; 
      boolean b2 = mall2.isClickable; 

      return (b1 != b2) ? (b1) ? -1 : 1 : 0; 
     } 
    }); 
+1

không bao giờ làm những thứ như 'if (someboolean == true)' là một mã có mùi và tương đương với 'if (someboolean)' – soulcheck

+2

lồng nhau thứ hai 'if' ('if (b1 == false) {') có thể được thay thế chỉ với 'return 1;'. – Holloway

+1

Bạn vừa phải và nội dung của 'if' bên ngoài có thể được thay thế bằng' return b1? -1: 1; ': D – Tom

23

Một cách khác để đi là:

Collections.sort(abc, new Comparator<Abc>() { 
     @Override 
     public int compare(Abc abc1, Abc abc2) { 
      return Boolean.compare(abc2.isClickable,abc1.isClickable); 
     } 
    }); 
+4

Chỉ cần nhận xét về điều này: Boolean.compare yêu cầu cấp API 19 nếu ứng dụng của bạn hỗ trợ các cấp thấp hơn, bạn nên sử dụng các câu trả lời khác, nếu không thì điều này tốt cho API 19 trở lên. – ziniestro

+0

Đối với thứ tự giảm dần, tôi có thể tìm kiếm '-Boolean.compare (abc1.isClickable, abc2.isClickable)' thay thế. Việc chuyển đổi thứ tự abc1 và abc2 dường như rất dễ bỏ sót, khiến cho người ta nghĩ rằng phương pháp chỉ sắp xếp theo thứ tự tăng dần. – Dukeling

1

Java 8:

Collections.sort(abc, (abc1, abc2) -> 
        Boolean.compare(abc2.isClickable(), abc1.isClickable())); 
1

Nó cũng có thể như vậy.

myList.sort((a, b) -> Boolean.compare(a.isSn_Principal(), b.isSn_Principal())); 
Các vấn đề liên quan