2015-01-04 63 views
4

我想用字符串对地图进行排序,以便某些字符串按优先顺序排列,其余按照惯例排序。在排序地图时优先考虑某些字符串的最佳方法

像这样:

"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); 
} 

正如你所看到的,这得到更优先的字符串相当繁琐。

有没有更好的方法来做到这一点?


解决方案(感谢阿米特的想法): 使用第二映射到存储的优先级:

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); 
    } 
}; 
+0

以哪种方式排列优先顺序?通过枚举?按其他标准? – sodik 2015-01-04 12:26:02

+0

我想给某些字符串一个硬编码的优先级。 (我相应地编辑了这个问题) – 2015-01-04 12:35:55

回答

3

使用第2个地图:

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

在您的比较 - 根据prio.get(o1).compareTo(prio.get(o2)) 先比较,且仅当结果为0,回落到正常字符串的compareTo()

创建map后,prio不会改变,这一点很重要,否则您的地图将是一个完整的混乱,无法正确查找和插入元素。


(1)确保这两个元素首先存在于prio,如果一个人不 - 解决。

+0

我现在就试一试;) – 2015-01-04 12:30:46

+0

我在问题中加入了我的实现。它似乎在做这项工作。即使它只有3个优先字符串可能有点多,它至少看起来不像我的ifs队列那样愚蠢:P - 谢谢 – 2015-01-04 13:11:15