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

uhry853o  于 2023-06-04  发布在  Java
关注(0)|答案(3)|浏览(248)

我们有一个List<Country>,它保存了按字母顺序排列的国家列表,按countryName排序。

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

Country是一个实体对象,我们无法访问源代码(它在一个jar文件中,由许多应用程序共享)。
现在,我想修改列表,使国家名称“美利坚合众国”和“英国”排在第一位,列表的其余部分按相同的字母顺序排列。
最有效的方法是什么?

8wigbo56

8wigbo561#

结合Collections.Sort(collection, Comparator)创建您自己的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);
    }
}

输出:
美利坚合众国
英国
巴林
比利时
芬兰
乐高乐园
墨西哥
我误解了你的问题在第一次(或它被添加为忍者编辑),所以这里的更新版本。

eyh26e7m

eyh26e7m2#

Comparator中实现该规则。您可以使用Collections.sort()对列表进行排序

vohkndzv

vohkndzv3#

简单一点:

var result = countries
    .OrderByDescending(item => item.countryName == "United States of America")
    .ThenByDescending(item => item.countryName == "United Kingdom")
    .ThenBy(item => item.countryName );

相关问题