【发布时间】:2021-11-01 17:41:27
【问题描述】:
我想按给定的顺序对 TreeMap 进行排序。 如果字符串中有'_',放在最后,或者保持添加的顺序。
class Order implements Comparator<String> {
@Override
//This works but mess up the group order. For instance bbbb comes after 'aaaa'
// instead of 'cccc'
public int compare(String o1, String o2) {
if(o1.contains("_")) {
order = 1;
}
if(o2.contains("_")) {
order = order == 1? 0: -1;
}
return order == 0 ? o1.compareTo(o2) : order;
}
}
class Test {
public static void main(String[] args) {
Map<String, String> treeMap= new TreeMap<>(new Order());
signalTypeMap.put("ccc_aaaa", "test");
signalTypeMap.put("aaaa", "test");
signalTypeMap.put("cccc", "test");
signalTypeMap.put("bbbb", "test");
signalTypeMap.put("ccc", "test");
signalTypeMap.put("c_a", "test");
}
}
最后,地图应该按照以下顺序。
{ aaaa=test, cccc=test bbbb=test, ccc=test, ccc_aaaa=test, c_a=test}
【问题讨论】:
-
Comparator.comparingBoolean(s -> s.contains("_")).thenComparing(Comparator.naturalOrder())? -
"或者保持添加的顺序" TreeMap 不保留插入顺序。它只使用比较器,比较器不应该知道插入顺序。
-
@AndyTurner 我没有看到类似比较Boolean()
-
Java 太旧,然后
Comparator.comparingInt(s -> s.contains("_")? 1 : 0).thenComparing(Collator.getInstance(Locale.US))。我建议在有特殊字符时使用语言环境,因此在德语中,“Österreich”(奥地利)放在“P”之前 -
@k314159 我只是再次编造 API 方法。我当然是指
Comparator.comparing(s -> s.contains("_"))。
标签: java comparator treemap