2015-10-05 61 views
0

我有一个地图与关键字字符串和值字符串和一个字符串列表。我想根据列表中存在的值的顺序对键进行排序。从其按键排序的地图从另一个列表中的值排序

package da.fa; 


public class MapSorted { 

public static void main(String[] args) { 

    List<String> efgh = new ArrayList<String>(); 
    efgh.add("ccc"); 
    efgh.add("aaa"); 
    efgh.add("ddd"); 
    efgh.add("aaa"); 

    Map<String, String> abcd = new HashMap<String, String>(); 
    abcd.put("aaa", "1111"); 
    abcd.put("bbb", "1111"); 
    abcd.put("ccc", "1111"); 
    abcd.put("ddd", "1111"); 
    abcd.put("eee", "1111"); 
} 
} 

在这里,abcd应该按照efgh列表中的值排序。

+2

可能重复的[如何在Java中按键排序映射值](http://stackoverflow.com/questions/922528/how-to-sort-map-values-by-key-in-java) – agpt

+0

yes ,我想你可以通过“更长的答案”去建立你自己的比较器。 – 0X0nosugar

回答

1

包含HashMap是不排序,使用TreeMap的替代:

public static void main(String[] args) { 

     // define the needed keys 
     List<String> neededKeys = new ArrayList<String>(); 
     neededKeys.add("ccc"); 
     neededKeys.add("aaa"); 
     neededKeys.add("ddd"); 
     neededKeys.add("aaa"); 

     // build a simple hashmap (unsorted) 
     Map<String, String> unsortedMap = new HashMap<String, String>(); 
     unsortedMap.put("aaa", "1111"); 
     unsortedMap.put("bbb", "1111"); 
     unsortedMap.put("ccc", "1111"); 
     unsortedMap.put("ddd", "1111"); 
     unsortedMap.put("eee", "1111"); 

     // build a sorted TreeMap and pass only the necessary objects 
     TreeMap<String, String> sortedMap=new TreeMap<String, String>(); 
     for(String key:unsortedMap.keySet()){ 
      // copy needed keys ONLY to a new sorted map 
      if (neededKeys.contains(key)){ 
       sortedMap.put(key, unsortedMap.get(key)); 
      } 
     } 

     System.out.println(unsortedMap); 
     System.out.println(sortedMap); 
    } 
0

如果从上述后how to sort Map values by key in Java如下建议,你应该写这样的事情:

Comparator<Foo> comparator = new Comparator<Foo>() { 
    List<String> final order = .. //Pass your list here; 

    public int compare(String o1, Stringo2) { 
    int i1 = order.ingexOf(o1); 
    int i2 = order.indexOf(o2); 
    return i1 > i2 ? 1 : (i1 < i1 ? -1 : 0); 
    } 
} 
Map<String, String> map = new TreeMap<>(comparator); 
map.addAll(abcd); 

但是你需要它对于?如果你想通过后面的map来迭代,你可以遍历列表然后获取值。它会更快。

而且你应该从你的列表中删除重复项:

List<String> efgh = new ArrayList<String>(); 
... 
efgh.add("aaa"); 
.. 
efgh.add("aaa"); 

否则,此解决方案不会工作。