Я сортирую массив настраиваемых объектов (ListData[]) по двум полям. Я хочу, чтобы он был отсортирован по теме, а их по имени. Я думал, что сделал хороший компаратор в классе пользовательских объектов и что я могу использовать Arrays.sort(ld), чтобы заставить мой код работать и сортировать мой массив. Но, видимо, я что-то делаю не так ...

Мой настраиваемый объект:

   public class ListData implements Comparable<ListData>{
public int venueID;
public String name;
public String photoUrl;
public String tip;
public String theme;
@Override
public int compareTo(ListData ld0) {
    return this.venueID- ld0.venueID;
}

public static Comparator<ListData> ListDataThemeAndNameComparator = new Comparator<ListData>() {
    @Override
    public int compare(ListData ld1, ListData ld2) {

        String compareTheme1 = ld1.theme.toUpperCase();
        String compareTheme2= ld2.theme.toUpperCase();
        String compareName1 = ld1.name.toUpperCase();
        String compareName2= ld2.name.toUpperCase();

        //ascending
        int comp = compareTheme1.compareTo(compareTheme2); // comp themes
        if(comp==0){ // same theme
            comp= compareName1.compareTo(compareName2); // compare names 
        }
        return comp;
        }
};


}

И в своей основной деятельности у меня есть:

 ListData ld[]= new ListData[jsonResponse.size()];
(some code filling my ListData array)
 Arrays.sort(ld, ListData.ListDataThemeAndNameComparator); // compare by theme and then by name

Кто-нибудь знает, что я делаю не так?

Я отредактировал свой код , но он все равно не работает, теперь на исключении nullpointe на compareTheme1 = ld1.theme.toUpperCase();. Но я уверен, что мой массив не пуст, я записал его в строку перед сортировкой, и она заполнена примерно 500 элементами.

0
Jasper 23 Июл 2012 в 12:44

1 ответ

Лучший ответ

Ваш объект ListData должен реализовывать интерфейс Comparable, а не Comparator.

EDIT:

Чтобы прояснить ситуацию, вы можете отсортировать array по Array.sort(). Чтобы сделать настраиваемую сортировку, вы можете указать свой компаратор в Array.sort(), если вы этого не сделаете, массив будет отсортирован в естественном порядке, который вы можете определить, реализовав интерфейс Comparable. Итак, у вас есть два варианта пользовательской сортировки:

  • используя пользовательский компаратор и указав его в Array.sort()
  • путем реализации интерфейса Comparable для ваших элементов

Я предлагаю вам продолжить реализацию Comparable. Вы экономите память, не создавая новых объектов компаратора, и Comparator полезен, если вы сравниваете объекты разных типов, что не в вашем случае.

1
biegleux 23 Июл 2012 в 14:31
Я отредактировал свой код, и теперь у меня другая ошибка (объясненная в моем вопросе). Спасибо за ваш вклад, но только смена компаратора на сопоставимый (и, конечно, импорт и т. Д.) Не решает мою проблему.
 – 
Jasper
23 Июл 2012 в 14:04
Ваш массив может быть не пустым, но кажется, что некоторые из ваших элементов не инициализировали поле темы. Проверьте тему и имя на null.
 – 
biegleux
23 Июл 2012 в 14:08
Ты прав. У меня было несколько пустых полей в конце массива, потому что я объявил массив большого размера. Я меняю его на arraylist, но когда я использовал правильный номер, он работал.
 – 
Jasper
23 Июл 2012 в 14:22