2015-03-19 2 views
0

У меня есть код ниже, чтобы получить данные из базы данных SQLite в android.Collections.sort - «должен реализовать java.lang.Comparable»

SystemCountryListDS system_country_list_ds; 
system_country_list_ds.open(); 
List<SystemCountryList> system_country_list = system_country_list_ds.findAll(); 

Я хочу этот список в порядке возрастания по названию страны. Как я могу это сделать?

Я пытался сделать это в списке:

Collections.sort(system_country_list); 

Это дает мне ошибку:

inferred type is not within its bound; should implement java.lang.comparable

+0

вам необходимо предоставить объект-компаратор для сортировки в качестве второго параметра, где вы укажете, как метод будет сортировать набор данных – Blackbelt

+0

Что происходит с вами * поиск * для ошибки? Поскольку ошибка говорит о том, что это означает: SystemCountryListDS не реализует Comparable; см. документацию Collections.sort, почему она требуется. (Это исключение не имеет * ничего *, связанного с SQLite, но если он может быть/упорядочен в SQLite, вам не нужно будет делать это на Java.) – user2864740

+0

http://developer.android.com/reference/java/ lang/Comparable.html, http://www.mkyong.com/java/java-object-sorting-example-comparable-and-comparator/, http://stackoverflow.com/questions/20204667/java-generics-inserting -inner-type-parameter – user2864740

ответ

0

это означает, что SystemCountryListDS не реализует Сопоставимые интерфейс. Существует Collections.sort, где вы можете передать компаратор Collections.sort with Comporator

Вы можете сделать

Collections.sort(system_country_list, new Comparator<SystemCountryListDS>() { 
      @Override public int compare(SystemCountryListDS o1, SystemCountryListDS o2) { 
       if (o1 == o2) 
        return 0; 
       if (o1 == null) 
        return -1; 
       if (o2 == null) 
        return 1; 

       String country1 = o1.getCountry(); 
       String country2 = o2.getCountry(); 

       if (country1 == country2) 
        return 0; 
       if (country1 == null) 
        return -1; 
       if (country2 == null) 
        return 1; 
       return country1.compareTo(country2); 
      } 
     }); 
0

This interface imposes a total ordering on the objects of each class that implements it. This ordering is referred to as the class's natural ordering, and the class's compareTo method is referred to as its natural comparison method.

Итак, что документы вам сказать, что все, что класс, который вы хотите отсортировать должен реализовывать Comparable интерфейс, чтобы он стал сопоставимым. Для сравнения двух объектов используется метод compareTo.

Если, однако, вы не хотите реализовывать Comparable, вы можете создать новый класс, который реализует интерфейс Comparator.

A comparison function, which imposes a total ordering on some collection of objects. Comparators can be passed to a sort method (such as Collections.sort or Arrays.sort) to allow precise control over the sort order.

0

Ваш класс должен применять Comparable<>. См. Подробный пример here.

0

Вы можете получить название страны, как вы взыскательные возрастанию или DESC при извлечении данных из таблицы базы данных в SQLite как с помощью инструкции запроса или rawQuery

запроса (Cursor запроса (String таблицы, String [] колонны, выбор String, String [] selectionArgs, String группиЙ, String, имеющая, String OrderBy, предел String)) ->

SqliteDBObject.query(tableName,new String[] {ColumnNameOfCountry},null,null,null,null,ColumnNameOfCountry+" asc",null);

или с помощью курсора rawQuery (String SQL, String [] selectionArgs) - ->

SqliteDBObject.rawQuery ("select ColumnNameOfCountry from tableName order by ColumnNameOfCountry asc ", null); 

это как запрос будет возвращать вам курсор, который имеющий столбец ColumnNameOfCountry с данными как по возрастанию или если вы хотите, чтобы ваши данные в порядке убывания так заменить слово asc как в запросе к DESC и вы получите Это. и используйте этот курсор для вывода данных в классе SystemCountryListDS, выполнив операцию в findAll() и добавьте в список и верните его, чтобы установить адаптер или где бы вы его ни использовали.

другой путь это путь вы попробуйте, как сортировка, используя Collections класс, но функция, которую вы использовали в Collections.sort(system_country_list); это вы для только тех класса, который имеет реализуют интерфейс Comparable. он будет сортироваться в естественном порядке по умолчанию (только по возрастанию), поскольку String реализовала этот интерфейс, чтобы вы могли использовать эту функцию, и без каких-либо проблем вы получите нужный результат.

, но в вашем случае вы можете достичь того же в два пути либо реализаций Сопоставимого интерфейса или используя собственного класс Comparator пути реализации компаратора интерфейсу примера из сравнимых (в вашем случае)

class SystemCountryList implements Comparable<SystemCountryList> 
{ 
     /*All your field or variable and member function will go here */ 
    /** i m assuming that you country name will varible or field is 
      country 
      and you have used the getter and setter function for it 
      if not below i am writing 
     **/ 
     private String country; 
     public void setCountry(String country) 
     { 
     this.country=country; 
     } 
     public String getCountry() 
     { 
     return country; 
     } 

    /* 
    ** Implement the natural order for this class 
    */ 
    public int compareTo(SystemCountryList s) 
    { 
     return getCountry().compareTo(s.getCountry()); 
    } 
} 

Теперь наш код будет работать

Collections.sort(system_country_list); 

другой путь сделать свой собственный вызов компаратора

Collections.sort(system_country_list, new Comparator<SystemCountryList>() { 
    @Override 
    public int compare(SystemCountryList s1, SystemCountryList s2) { 
     return (s2.getCountry()).compareTo(s1.getCountry()); 
    } 
});