2015-01-17 4 views
8

Я хочу отсортировать мой ArrayList с помощью булевого типа. В основном я хочу показать записи с true. Вот мой код ниже:Сортировка ArrayList примитивным булевым типом

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

заказа до сортировки: истинного истинного истинного ложь ложь лжи f Alse истинного ложного ложного

ордена после сортировки: ложных ложных истинного истинного истинного истинного ложного ложных ложных ложного

+2

если они являются '==' return 0. Если они являются '! =', То используйте 1 или -1 на основе того, является ли первая истиной или ложью. –

+2

Ваше второе условие 'if' никогда не будет оцениваться как' true'. Это синоним первого. – 5gon12eder

+0

вам нужно определить сортировку, в которой вы нуждаетесь, связана ли она с идентификатором? – roeygol

ответ

3

Простого предложения было бы использовать объект Boolean вместо boolean и использовать Collections.sort.

Однако, вы должны знать, что false будет до true, потому что верно представлены как 1 и фальшива, как 0. Но тогда вы можете просто изменить свой алгоритм и получить доступ в обратном порядке.

Редактировать: Как указано в описании soulscheck, вы можете использовать Collections.reverseOrder, чтобы вернуть заказ, назначенный компаратором.

10

В этом случае один из самых простых решений для преобразования булевых в целые числа, где false является 0 и true является 1. Затем верните разницу второго и первого.

Итак:

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

     return b2 - b1 

должны это сделать.

4

Я хочу, чтобы элементы с true значения отображались первыми. Мое решение было бы:

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

никогда не делайте такие вещи, как 'if (someboolean == true)' это запах кода и эквивалентен 'if (someboolean)' – soulcheck

+2

второй вложенный 'if' (' if (b1 == false) {') можно заменить с просто 'return 1;'. – Holloway

+1

Вы оба правы, а тело внешнего 'if' можно заменить на' return b1? -1: 1; ': D – Tom

23

Другой способ пойти:

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

Просто комментарий к этому: Boolean.compare требует уровня API 19, если ваше приложение поддерживает более низкие уровни, вы должны использовать другие ответы, в противном случае это хорошо для API 19 и выше. – ziniestro

+0

В порядке убывания, я бы, скорее всего, пошел на '-Boolean.compare (abc1.isClickable, abc2.isClickable)'. Переключение порядка abc1 и abc2 кажется очень легко пропустить, заставляя думать, что метод просто сортируется в порядке возрастания. – Dukeling

1

Java 8:

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

Также возможно, что путь.

myList.sort((a, b) -> Boolean.compare(a.isSn_Principal(), b.isSn_Principal())); 
Смежные вопросы