23

我尝试了几个小时,但没有找到任何最佳方法来实现哈希图的反向迭代,这就是我拥有的哈希图。

      Map<Integer, List<String>> map = new HashMap<Integer, List<String>>();

             for(Integer key : map.keySet()) {
                List<String> value = map.get(key);
                List<Map<String,?>> security = new LinkedList<Map<String,?>>();  
                for(int ixy = 0; ixy < value.size()-1; ixy++){
                    security.add(createItem(value.get(ixy), value.get(ixy+1))); 
                }
                adapter.addSection(Integer.toString(key), new SimpleAdapter(getApplicationContext(), security, R.layout.list_complex, new String[] { ITEM_TITLE, ITEM_CAPTION }, new int[] { R.id.list_complex_title, R.id.list_complex_caption }));  
            }

我也看过 TreeMap 的例子,

             Map<Integer, List<String>> sortedMap = new TreeMap<Integer, List<String>>(map);

但是树形图也按升序给出,我想要的是降序。

4

12 回答 12

49

以相反顺序实现哈希图迭代的最佳方法

HashMap没有定义其元素的任何特定顺序。因此,也没有定义“反向”顺序。

对于一个TreeMap,您可以使用descendingMap().

于 2012-05-15T07:33:39.497 回答
24

Hashmap 没有特定的顺序。但是你可以使用 TreeMap。

也许这个简单的例子可以帮助你:

Map<Integer, String> map = new TreeMap<Integer, String>();
        map.put(1, "abc1");
        map.put(2, "abc2");
        map.put(3, "abc3");

        ArrayList<Integer> keys = new ArrayList<Integer>(map.keySet());
        for(int i=keys.size()-1; i>=0;i--){
            System.out.println(map.get(keys.get(i)));
        }
于 2012-05-15T07:43:38.337 回答
14

HashMap 不维护键之间的任何顺序。

TreeMap 按其自然顺序或按您在构建映射时传递的比较器强加的顺序对其键进行排序。因此,如果您想让 Integer 键以相反的顺序排列,请以这种方式构造 TreeMap:

Map<Integer, List<String>> sortedMap = 
    new TreeMap<Integer, List<String>>(Collections.reverseOrder());
于 2012-05-15T07:35:47.910 回答
6

你可以使用TreeMap#descendingKeySet方法。

Map<Integer, List<String>> map = new TreeMap<Integer, List<String>>();

for(Integer key : map.descendingKeySet()) {
    List<String> value = map.get(key);
    List<Map<String,?>> security = new LinkedList<Map<String,?>>();  
    for(int ixy = 0; ixy < value.size()-1; ixy++){
        security.add(createItem(value.get(ixy), value.get(ixy+1))); 
    }
    adapter.addSection(Integer.toString(key), new SimpleAdapter(getApplicationContext(), security, R.layout.list_complex, new String[] { ITEM_TITLE, ITEM_CAPTION }, new int[] { R.id.list_complex_title, R.id.list_complex_caption }));
} 

参考

https://docs.oracle.com/javase/8/docs/api/java/util/TreeMap.html#descendingKeySet--

于 2012-05-15T08:00:44.393 回答
6
Map<Integer, List<String>> sortedMap = new TreeMap<Integer, List<String>>(Collections.reverseOrder());

Collections.reverseOrder() keeps the map sorted in descending order.
于 2012-05-15T07:39:30.267 回答
4

由于以下原因,您不能HashMap反向迭代 a :

此类不保证地图的顺序;特别是,它不保证订单会随着时间的推移保持不变。

您应该使用的是LinkedHashMap

此实现与 HashMap 的不同之处在于它维护一个双向链表,该列表贯穿其所有条目。这个链表定义了迭代顺序,通常是键插入映射的顺序(插入顺序)。请注意,如果将键重新插入到地图中,则插入顺序不会受到影响。(如果在调用 m.containsKey(k) 将在调用之前立即返回 true 时调用 m.put(k, v),则将键 k 重新插入到映射 m 中。)

于 2012-05-15T07:34:58.927 回答
4

hashmap 不是有序集合。改用 TreeMap,它具有用于反向迭代的 descendingKeySet。请参阅javadocsLinkedHashMap也是一个不错的选择。

于 2012-05-15T07:35:51.540 回答
3
    TreeMap<Integer, String> map = new TreeMap<Integer, String>();
    map.put(1, "abc1");
    map.put(2, "abc2");
    map.put(3, "abc3");
    NavigableMap<Integer, String> nmap = map.descendingMap();
    for (NavigableMap.Entry<Integer, String> entry : nmap.entrySet()) {
        System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue());
    }

NPE思想的实现。

于 2016-11-23T17:38:46.543 回答
2

但是树形图也按升序排列,我想要的是降序排列。

实现一个Comparator将其与自然顺序相反的比较,然后正常迭代你将进行反向迭代

于 2012-05-15T07:39:34.510 回答
2

也许你需要一个NavigableMap,比如 TreeMap。

于 2012-05-15T07:35:07.613 回答
2

使用 insted:

new TreeMap<>(Collections.reverseOrder())

你会得到你想要的。

于 2017-03-18T12:14:38.590 回答
0

我发现从 Java Hashtable 获得的迭代器通过: Hashtable.values().iterator() 和 Hashtable.keys().asIterator() 默认情况下都是相反的顺序。一个奇怪的是, values().iterator 的第一个最终值为“0”,我在填充它时没有添加它。

于 2020-05-02T14:09:55.160 回答