排序地图时优先处理某些字符串的最佳方法

时间:2015-01-04 12:22:19

标签: java string sorting compare treemap

我想用字符串对地图进行排序,以便优先处理某些字符串,其他字符串照常排序。

像这样:

"Dan",   "value"  //priority 1
"Eric",  "value"  //priority 2
"Ann",   "value"  //priority 3
"Bella", "value"  //no priority
"Chris", "value"  //no priority

就像this问题一样。

我使用的是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);
}

正如您所看到的,对于更优先的字符串,这会非常麻烦。

有更好的方法吗?


解决方案(感谢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);
    }
};

1 个答案:

答案 0 :(得分:3)

使用第二张地图:

Map<String,Integer> prio其中值是每个字符串的优先级。

在你的比较器中 - 首先根据prio.get(o1).compareTo(prio.get(o2)) 1 进行比较,并且只有当结果为0时,才会回退到常规字符串&#39; s compareTo()

创建prio后,map不会发生变化,这一点非常重要,否则您的地图将会完全混乱而无法正确查找和插入元素。


(1)确保prio中的两个元素都存在,如果没有,则解析。