如何按升序对包含列表的对象进行排序

时间:2019-05-06 07:35:02

标签: java

我想按升序从列表中获取数据。

List<Region> region = (List<Region>) model.get("region");

如果我使用的是Collection.sort(region);

然后显示此内容, 类型Collections中的sort(List)方法不适用于参数(List)

4 个答案:

答案 0 :(得分:2)

您需要将类Region定义为Comparable,或者需要将类型Comparator的附加参数传递给sort方法。

没有Comparator的{​​{3}}是

public static <T extends Comparable<? super T>> void sort(List<T> list)[1]

和javadoc明确表示该类必须实现Comparable:

  

根据指定元素的自然顺序将指定列表升序排列。 列表中的所有元素必须实现Comparable接口。此外,列表中的所有元素必须相互可比较(也就是说,对于列表中的任何元素e1和e2,e1.compareTo(e2)均不得抛出ClassCastException。)

在这种情况下,您需要按照以下步骤修改代码:

public class Region implements Comparable {

    public int compareTo(Region o) {
       // Add the logic to compare regions here.
    }

    ... 
}

带有Comparator的第二个版本具有以下signature

public static <T> void sort(List<T> list, Comparator<? super T> c)

,并且所有元素都必须使用传递的Comparator进行比较:

  

根据指定比较器引起的顺序对指定列表进行排序。 列表中的所有元素必须使用指定的比较器可以相互比较(也就是说,c.compare(e1,e2)不得对列表中的任何元素e1和e2抛出ClassCastException。) >

在这种情况下,您需要直接调用sort方法来更改代码,如下所示:

Collections.sort(regionList, (Region r1, Region r2)-> {
    // Add compare logic here
});

注意:您的代码中还有一个小错误,该类要使用的类是Collections(带有s),而不是接口Collection。我还将列表的名称从region更改为regionList(最终将其命名为region),因为它不仅是单个元素,而且还是列表。

答案 1 :(得分:0)

您可以将排序留给数据库查询。

似乎值应该是唯一的,您也可以将实现类的SortedSet作为模型:TreeSet

答案 2 :(得分:0)

代码行中的自定义比较器,

List<Region> region = (List<Region>) model.get("region");
Collections.sort(region, new Comparator<Region>() {
 @Override
 public int compare(Region a1, Region a2) {
    return a1.getType().compareToIgnoreCase(a2.getType()); //You can alter this condition based on your condition to compare
 }
});

答案 3 :(得分:0)

我做完了...

Collections.sort(region, new Comparator<Region>() {
            public int compare(Region obj1, Region obj2) {
                return obj1.getStrRegion().compareTo(obj2.getStrRegion());
            }
        });