根据从地图获得的优先级对具有字符串的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会很好吗?提前感谢您的时间。
答案 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
可以从比较器中使用。