如何在Java中以相反的顺序迭代hashmap

时间:2012-05-15 07:32:09

标签: java hashmap

我正在尝试这个一小时,但没有找到任何最好的方法来以相反的顺序实现hashmap的迭代,这是我的hashmap。

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

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

12 个答案:

答案 0 :(得分:45)

  

以相反顺序实现hashmap迭代迭代的最佳方法

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

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

答案 1 :(得分:18)

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

答案 2 :(得分:11)

HashMap不会在键之间维持eny顺序。

TreeMap按其自然顺序或按构造地图时传递的比较器强加的顺序对其键进行排序。因此,如果您希望以相反的顺序排序Integer键,请以这种方式构造TreeMap:

Map<Integer, List<String>> sortedMap = 
    new TreeMap<Integer, List<String>>(Collections.reverseOrder());

答案 3 :(得分:6)

Map<Integer, List<String>> sortedMap = new TreeMap<Integer, List<String>>(Collections.reverseOrder());

Collections.reverseOrder() keeps the map sorted in descending order.

答案 4 :(得分: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--

答案 5 :(得分:4)

由于this

,您无法反向迭代HashMap
  

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

您应该使用的是LinkedHashMap

  

这个实现与HashMap的不同之处在于它维护了一个   贯穿其所有条目的双向链表。这有联系   list定义迭代排序,通常是顺序   哪些键被插入到地图中(插入顺序)。注意   如果将键重新插入地图,则不会影响插入顺序。   (如果调用m.put(k,v),则将密钥k重新插入到映射m中   m.containsKey(k)将在紧接之前返回true   调用。)

答案 6 :(得分:4)

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

答案 7 :(得分:3)

public class nested_radical {

public nested_radical() {
    int n = 1;

    while ((loop(n) - loop(n - 1)) > 10e-6) {
        n++;
    }
    System.out.println("value of given expression = " + loop(n));
    System.out.println("Iterations required = " + n);
}

public double loop(int n) {
    double sum = 0;
    while (n > 0) {
        sum = Math.sqrt(sum + n--);
    }
    return (sum);
}


public static void main(String[] args) {
    new nested_radical();
}

}

实施NPE理念。

答案 8 :(得分:2)

也许您需要NavigableMap,就像TreeMap一样。

答案 9 :(得分:2)

  

但是树形图也给出了一个令人反感的顺序,我想要的是降序。

实现一个Comparator,它将比自然顺序比较它,然后正常迭代你会反向迭代

答案 10 :(得分:2)

使用insted:

new TreeMap<>(Collections.reverseOrder())

你会得到你想要的东西。

答案 11 :(得分:0)

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