Rob*_*ann 5 java sorting string compare treemap
我想用字符串对地图进行排序,以便对某些字符串进行优先排序,而其余的则像往常一样排序。
像这样:
"Dan", "value" //priority 1
"Eric", "value" //priority 2
"Ann", "value" //priority 3
"Bella", "value" //no priority
"Chris", "value" //no priority
Run Code Online (Sandbox Code Playgroud)
就像在这个问题中一样。
我正在使用 TreeMap 并且我当前的比较方法如下所示:
public int compare(String o1, String o2) {
if (o1.equals(o2)) return 0;
if (o1.equals("Dan")) return -1;
if (o2.equals("Dan")) return 1;
if (o1.equals("Eric")) return -1;
if (o2.equals("Eric")) return 1;
if (o1.equals("Ann")) return -1;
if (o2.equals("Ann")) return 1;
else return o1.compareTo(o2);
}
Run Code Online (Sandbox Code Playgroud)
如您所见,对于优先级更高的字符串,这会变得非常麻烦。
有一个更好的方法吗?
解决方案(感谢 amit 的想法):使用第二张地图来存储优先级:
TreeMap<String, Integer> prio = new TreeMap<>();
prio.put("Dan", 1);
prio.put("Eric", 2);
prio.put("Ann", 3);
comparator = new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if (prio.containsKey(o1)) {
if (prio.containsKey(o2)) {
return prio.get(o1).compareTo(prio.get(o2));
} else return -1;
} else if (prio.containsKey(o2)) {
return 1;
} else return o1.compareTo(o2);
}
};
Run Code Online (Sandbox Code Playgroud)
使用第二张地图:
Map<String,Integer> prio其中该值是每个字符串的优先级。
在您的比较器中 - 首先根据prio.get(o1).compareTo(prio.get(o2))1进行比较,并且仅当结果为 0 时,才回退到常规 String 的compareTo()。
重要的是在创建prio后不要更改map,否则您的地图将完全混乱,无法正确查找和插入元素。
(1) 确保两个元素都首先存在于 中prio,如果其中一个不存在 - 则解析。