Collections.sort - “应该实现java.lang.Comparable”

时间:2015-03-19 15:07:55

标签: java android

我有以下代码从android中的SQLite数据库获取数据。

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

它给了我错误:

  

推断类型不在其范围内;应该实现java.lang.comparable

4 个答案:

答案 0 :(得分:0)

这意味着SystemCountryListDS不会实现Comparable接口。 有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);
            }
        });

答案 1 :(得分:0)

  

此接口对每个类的对象施加总排序   实现它。这种排序称为类   自然排序,类的compareTo方法称为   它的自然比较方法。

所以,文档告诉你的是,你要排序的任何类都应该实现Comparable接口,以便它变得可比较compareTo方法将用于比较两个对象。

但是,如果您不想实现Comparable,则可以创建一个实现Comparator接口的新类。

  

比较函数,对某些函数施加总排序   对象的集合。可以将比较器传递给排序方法   (例如Collections.sort或Arrays.sort)允许精确控制   超过排序顺序。

答案 2 :(得分:0)

您的班级应该实施Comparable<>。有关详细示例,请参阅here

答案 3 :(得分:0)

您可以在sqlite中从数据库表中获取数据时获取asc或desc所需的国家/地区名称 比如使用查询语句或rawQuery

query(Cursor query(String table,String [] columns,String selection,String [] selectionArgs,String groupBy,String having,String orderBy,String limit)) - &gt;

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

或 通过Cursor rawQuery(String sql,String [] selectionArgs)---&gt;

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

这两个查询都会返回光标,其中列ColumnNameOfCountry的数据为升序,或者如果您希望数据按降序排列,请将查询中的单词asc替换为DESC你会明白的。 并使用此游标通过在SystemCountryListDS中执行操作来取出findAll()类中的数据并添加到列表并将其返回以设置为适配器或您想要使用它的位置。

其他方式是您尝试使用Collections类进行排序的方式,但您使用的函数是Collections.sort(system_country_list);,您是唯一一个实现Comparable接口的类。默认情况下它将按自然顺序排序(仅限升序),因为String已实现此接口,因此您可以使用此功能而没有任何问题,您将获得所需的结果。

但在你的情况下 你可以通过实现比较器接口实现Comparable接口或使用自己的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());
    }
});