对列表进行排序,同时保持一些元素始终位于顶部

时间:2014-01-09 04:36:11

标签: java sorting collections arraylist

我们有List<Country>按字母顺序排列按countryName排序的国家/地区列表。

 class Country {
   int id;
   String countryCode;
   String countryName;
 }

Country是一个实体对象,我们无法访问源代码(它位于许多应用程序共享的jar文件中)。

现在我想以这样的方式修改列表:国家名称“美利坚合众国”和“英国”排在第一位,列表的其余部分按字母顺序排列。

最有效的方法是什么?

2 个答案:

答案 0 :(得分:9)

comparator一起创建您自己的Collections.Sort(collection, Comparator)。这与普通Comparator的不同之处在于,您必须明确优先考虑您最想要的条目。

public class Main {
    public static void main(String[] args) {
        new Main();
    }

    public Main(){
        List<Country> list = new ArrayList<>();
        list.add(new Country("Belgium"));
        list.add(new Country("United Kingdom"));
        list.add(new Country("Legoland"));
        list.add(new Country("Bahrain"));
        list.add(new Country("United States of America"));
        list.add(new Country("Mexico"));
        list.add(new Country("Finland"));


        Collections.sort(list, new MyComparator());

        for(Country c : list){
            System.out.println(c.countryName);
        }
    }
}

class Country {
    public Country(String name){
        countryName = name;
    }

    int id;
    String countryCode;
    String countryName;

}

class MyComparator implements Comparator<Country> {
    private static List<String> important = Arrays.asList("United Kingdom", "United States of America");

    @Override
    public int compare(Country arg0, Country arg1) {
        if(important.contains(arg0.countryName)) { return -1; }
        if(important.contains(arg1.countryName)) { return 1; }
        return arg0.countryName.compareTo(arg1.countryName);
    }
}

输出:

  

美利坚合众国   英国
  巴林
  比利时
  芬兰
  乐高乐园
  墨西哥

我最初误读了您的问题(或者它被添加为忍者编辑)所以这是更新版本。

答案 1 :(得分:1)

Comparator中实施该规则。您可以使用Collections.sort()

对列表进行排序