2011-03-20 75 views
11

我需要调用一个外部API与一个ArrayList的HashMaps每个持有几个预定义的键值对。例如:HashMap的ArrayList如何对每个键持有几个键值对进行排序?

ArrayList<HashMap<String, String>> arrayListHashMap = new ArrayList<HashMap<String, String>>(); 

    { 
     HashMap hashMap = new HashMap<String, String>(); 
     hashMap.put("key", "A key"); 
     hashMap.put("value", "B value"); 
     arrayListHashMap.add(hashMap); 
    } 

    { 
     HashMap hashMap = new HashMap<String, String>(); 
     hashMap.put("key", "B key"); 
     hashMap.put("value", "A value"); 
     arrayListHashMap.add(hashMap); 
    } 

现在我需要对“value”键的内容进行排序。这种排序会导致“key = B key/value = A”条目作为arrayListHashMap中的第一个条目。

任何帮助,高度赞赏。

HJW

回答

31

你需要实现一个Comparator<HashMap<String, String>>或者更一般Comparator<Map<String, String>>刚刚取得与value键assocated的值,然后使用Collections.sort。示例代码(与泛化为要排序上的任何键):

class MapComparator implements Comparator<Map<String, String>> 
{ 
    private final String key; 

    public MapComparator(String key) 
    { 
     this.key = key; 
    } 

    public int compare(Map<String, String> first, 
         Map<String, String> second) 
    { 
     // TODO: Null checking, both for maps and values 
     String firstValue = first.get(key); 
     String secondValue = second.get(key); 
     return firstValue.compareTo(secondValue); 
    } 
} 

... 
Collections.sort(arrayListHashMap, new MapComparator("value")); 
+0

谢谢非常适合你的快速回答。 – 2011-03-20 16:49:45

+0

你好,如果我想对一些自定义标准进行排序会怎样?就像我有一个值说TEST一样,我希望对列表进行排序,使TEST的所有值都是第一位,然后是所有其他值。所以基本上如果我有大小列表让我说10,并且如果它包含测试值2次在位置5和8,然后我希望他们两个在上面。其他值将在此之后..可以请告诉我如何去做.. – Scorpion 2012-11-07 07:38:00

+0

@Scorpion:然后你写一个比较检查测试,并始终把它比任何其他值更早。哪一点你觉得困难? (这可能是最好的一个新的问题...) – 2012-11-07 07:46:48

0

(这不是一个答案,问的问题 - 乔恩这样做已经 - ,但注释字段是太小了这一点。)

您的数据结构看起来像您误解了地图的键值结构(在您的示例中为哈希贴图)。

一个Map可以包含任意数量的键,并且对于每个键也是一个值。一对密钥和值由Map.Entry给出(可以通过地图的entrySet()方法获得)。如果你想按键排序,只需使用SortedMap(如TreeMap)而不是通常的HashMap。

你被一个HashMap每个模拟的每个条目,然后把它们放在一个ArrayList的...: -/

在这里我会在你的例子做了:

Map<String, String> map = new TreeMap<String, String>(); 
map.put("B key", "B value"); 
map.put("A key", "B value"); 

System.out.println(map); // already sorted 
+1

感谢您的回答。我需要提供外部API - 这个想法不是我的。我所理解的是,他们模拟了数据库查询结果之类的东西。 ArrayList是查询结果,每个HashMap都是一条记录,每个条目都是一个字段名,它是值。 “关键”将是一个领域,而“价值”则是另一个领域。似乎我应该在示例中为这两个条目使用了不同的名称。只需要“field1”和“field2”而不是“key”和“value”。对困惑感到抱歉。 – 2011-03-20 16:47:42

+0

外部API实际上应该使用javabeans列表。 – BalusC 2011-03-20 16:49:22

相关问题