有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java是在对映射排序时对某些字符串进行优先级排序的最佳方法

我想用字符串对一个映射进行排序,这样某些字符串会被优先排序,而其他字符串会像往常一样被排序

像这样:

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

就像在{a1}问题中一样

我使用的是树形图,当前的比较方法如下所示:

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) 个答案

  1. # 1 楼答案

    使用第二张地图:

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

    在你的比较器中——首先根据prio.get(o1).compareTo(prio.get(o2))1进行比较,只有当结果为0时,才返回到常规字符串的compareTo()

    重要的是priomap创建后不发生更改,否则地图将完全混乱,无法正确查找和插入元素


    (1)确保两个元素都首先存在于prio中,如果其中一个元素不存在,则解析