【问题标题】:Sort java list alphabetically except some items [duplicate]除某些项目外,按字母顺序对java列表进行排序[重复]
【发布时间】:2019-11-21 00:34:34
【问题描述】:

我有一个名为 Country 的 java 类。

public class Conutry {
private String Code;
private String name;

public Conutry(String code, String name) {
    Code = code;
    this.name = name;
}

public String getCode() {
    return Code;
}

public void setCode(String code) {
    Code = code;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

}

我需要创建一个按名称排序的国家/地区列表。但是,美国和加拿大应该是列表中的前两项,其余按国家/地区名称的字母顺序排序。知道我无权访问 Country 类。我知道我必须使用 Comparator 但我没有知道这里的确切逻辑。

public class TestDrive {
public static void main(String[] args) {
    List<Conutry> list = new ArrayList<Conutry>();
    list.add(new Conutry("AR","Argentina"));
    list.add(new Conutry("AL","Albania"));
    list.add(new Conutry("US","United States of America"));
    list.add(new Conutry("JO","Jordan"));
    list.add(new Conutry("DZ","Algeria"));
    list.add(new Conutry("CA","Canada"));
    list.add(new Conutry("FR","France"));
    list.add(new Conutry("TR","Turkey"));
    list.add(new Conutry("BR","Brazil"));
    list.add(new Conutry("AE","United Arab Emirates"));

    //This is my code. I think there should be a better solution
    Comparator<Conutry> comparator = new Comparator<Conutry>() {
        @Override
        public int compare(Conutry c1, Conutry c2) {
            if("US".equals(c1.getCode()))
                return -1;
            if("CA".equals(c1.getCode()))
                if(c2.getCode()!="US")
                    return -1;
                else
                    return 1;

            if("US".equals(c2.getCode()))
                return 1;

            if("CA".equals(c2.getCode()))
                if("US".equals(c1.getCode()))
                    return -1;
                else
                    return 1;

             return c1.getName().compareTo(c2.getName()) ;
        }
    };

    list.stream().sorted(comparator).forEach(c-> System.out.println(c.getName()));


}

}

【问题讨论】:

  • 您需要对“自定义比较器”进行一些研究
  • 或者添加除美国和加拿大以外的所有内容,排序,然后insert美国和加拿大?
  • 然后使用sort!
  • 这是一个更紧凑的比较器:Map&lt;String, Integer&gt; priority = Map.of("US", -2, "CA", -1);Comparator&lt;Country&gt; comparator = Comparator.&lt;Country&gt;comparingInt(country -&gt; priority.getOrDefault(country.getCode(), 0)).thenComparing(Country::getName, Comparator.naturalOrder());
  • @boot-and-bonnet 非常感谢,这对我来说很好。

标签: java


【解决方案1】:

它是这样的:

public static void main(String[] args) {
    List<Conutry> list = new ArrayList<Conutry>();

    // putting these two at the start of the list
    list.add(new Conutry("US","United States of America"));
    list.add(new Conutry("CA","Canada"));

    // building the rest of the list
    list.add(new Conutry("AR","Argentina"));
    list.add(new Conutry("AL","Albania"));
    list.add(new Conutry("JO","Jordan"));
    list.add(new Conutry("DZ","Algeria"));
    list.add(new Conutry("FR","France"));
    list.add(new Conutry("TR","Turkey"));
    list.add(new Conutry("BR","Brazil"));
    list.add(new Conutry("AE","United Arab Emirates"));

    // comparator that compares conutry objects based on their names
    public class ConutryComparator implements Comparator<Conutry> {
        public int compare(Conutry a, Conutry b) {
            // I will leave the null handling part as exercise
            return a.getName().compareTo(b.getName());
        }
    }

    // then sort the sublist starting with third element (index 2)
    Collections.sort(list.sublist(2, list.size(), new ConutryComparator());

}

完成

【讨论】:

  • 我认为应该有更好的解决方案
  • 谈论胆大包天 -- 你为什么不向我们展示你在@Mido 上的尝试?
猜你喜欢
  • 2013-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-27
  • 2022-01-13
  • 2021-11-20
  • 2013-05-02
相关资源
最近更新 更多