【发布时间】: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<String, Integer> priority = Map.of("US", -2, "CA", -1);Comparator<Country> comparator = Comparator.<Country>comparingInt(country -> priority.getOrDefault(country.getCode(), 0)).thenComparing(Country::getName, Comparator.naturalOrder()); -
@boot-and-bonnet 非常感谢,这对我来说很好。
标签: java