基于从Map获得的优先级对ArrayList进行排序(Java版本< Java8)

时间:2015-09-15 21:50:02

标签: java sorting arraylist hashmap

根据从地图获得的优先级对具有字符串的ArrayList进行排序的最佳方法是什么。

例如: 我有一个为特定用例分配优先级的Map(Key:我在String中寻找的模式和Value:该模式的优先级)

Map pMap= new HashMap();
pMap.put("", 1);
pMap.put("1", 2);
pMap.put("2", 3);
pMap.put("3", 4);
pMap.put("4", 5);
pMap.put("*", 6);

List<String> listToBeSorted= new ArrayList<>();
listToBeSorted.add("Axxxx");
listToBeSorted.add("Ax4xx");
listToBeSorted.add("px*xxx");
listToBeSorted.add("px1xx");

我想根据第三个字符为列表中的每个字符串分配优先级,根据获得的优先级对列表进行排序。

我的方法:

获取listToBeSorted,迭代并获取每个字符串的优先级并插入Temp Hashmap,其中键为String,值为Priority。 最后返回带有排序键的新Arraylist。

预期结果: Arraylist包含以下数据:

Axxxx
px1xx
Ax4xx
px*xxx

这种方法目前有效但我不认为这是一种很好的方法,当数据量很大时。

有没有更好的方法来解决这个问题?

PS:我知道在Java 8中有一个更好的解决方案。但不幸的是我无法使用它。所以如果有人能给我一个更好的解决方案而不是Java8会很好吗?

提前感谢您的时间。

1 个答案:

答案 0 :(得分:6)

您只需要一个比较器,根据优先级比较两个字符串:

Comparator<String> priorityBasedComparator = new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        int priority1 = pMap.get(s1.substring(2, 3));
        int priority2 = pMap.get(s2.substring(2, 3));
        return Integer.compare(priority1, priority2);
    }
}
Collections.sort(list, priorityBasedComparator);

当然,pMap应该声明为Map<String, Integer>而不是原始地图(您不应该使用原始类型)。并且final可以从比较器中使用。