2015-10-05 58 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"); 

否則,此解決方案不會工作。