根据键对哈希图进行排序


79

我在Java中具有以下哈希图:

{B046 = 0.0,A061 = 3.0,A071 = 0.0,B085 = 0.0,B075 = 3.0,B076 = 9.0,B086 = 3.0,B095 = 0.0,B096 = 0.0,A052 = 0.0,B066 = 0.0,B056 = 9.0,B065 = 0.0,B055 = 9.0}

我应该如何对哈希图进行排序,以便考虑字母和数字?

生成的哈希图应如下所示:

{A052 = 0.0,A061 = 3.0,A071 = 0.0,B046 = 0.0,B055 = 9.0,B056 = 9.0,B065 = 0.0,B066 = 0.0,B075 = 3.0,B076 = 9.0,B085 = 0.0,B086 = 3.0,B095 = 0.0,B096 = 0.0}

感谢帮助!


3
哈希图用于查找。它散乱了东西。它不维持秩序。
穆罕默德·哈桑·汗

2
@HasanKhan ..谁甚至问过这个?
eRaisedToX

Answers:


239

使用排序TreeMap

Map<String, Float> map = new TreeMap<>(yourMap);

它将自动放置按键排序的条目。我认为自然String排序将适合您的情况。

请注意,HashMap由于查找优化,不会保留顺序。


嗨,@ Tomasz Nurkiewicz我如何获得相反的订单?
Raghavendra

我能将我自己的比较
Fakher

很好的解决方案!有一个2位数字的概率,排序成为1,10,11,12,2,3,4,5。有什么解决办法吗?
拉奇塔·南达

@RachitaNanda,您可以尝试使用整数而不是字符串存储数字。
克里希纳

27

将TreeMap与自定义比较器一起使用。

class MyComparator implements Comparator<String>
    {
        public int compare(String o1,String o2)
        {
            // Your logic for comparing the key strings
        }
    }

TreeMap<String, Float> tm = new TreeMap<String , Float>(new MyComparator());

添加新元素时,它们将自动排序。

在您的情况下,甚至不需要实现比较器,因为字符串排序可能就足够了。但是,如果要实现特殊情况,例如小写字母在大写字母之前出现,或以某种方式处理数字,请使用比较器。


11

TreeMap是您进行此类排序(自然)的最佳选择。TreeMap根据键自然排序。

HashMap不会保留插入顺序,也不会对地图进行排序。LinkedHashMap保留插入顺序,但不会自动对地图排序。仅TreeMapMap界面中,根据自然顺序对地图进行排序(数字首位,大写字母第二位,小写字母最后一位)。


5

使用TreeMap,尽管让地图看起来“有点像”有点模糊-您也可以根据条件对键进行排序,然后遍历地图,以获取每个对象。


3

只需使用即可TreeMap。它实现了SortedMap接口,从而自动对它包含的键进行排序。您可以按字母顺序对键进行排序以获得所需的结果,因此您甚至不需要提供比较器。

HashMap永远不会排序。您对HashMap唯一要做的就是获取所有密钥,并将它们存储在已排序的集合或列表中,然后对列表进行排序。


3

使用TreeMap可以对地图进行排序。

Map<String, String> map = new HashMap<String, String>();        
Map<String, String> treeMap = new TreeMap<String, String>(map);
//show hashmap after the sort
for (String str : treeMap.keySet()) {
    System.out.println(str);
}


2

使用TreeMap(构造函数):

Map<String, Float> sortedMap = new TreeMap<>(yourMap);

使用TreeMap(PutAll方法):

Map<String, Float> sortedMap = new TreeMap<>();
sortedMap.putAll(yourMap);

Map接口的实现:

  1. TreeMap-插入时自动按升序对键进行排序。
  2. HashMap-将不保留插入顺序。
  3. LinkedHashMap-将保持插入顺序。

1

TreeMap将自动按升序排序。如果要按降序排序,请使用以下代码:

将以下代码复制到您的类内和主要execute方法之外:

static class DescOrder implements Comparator<String> {
    @Override
    public int compare(String o1, String o2) {      
        return o2.compareTo(o1);
    }
    }

然后按照您的逻辑:

TreeMap<String, String> map = new TreeMap<String, String>(new DescOrder());
map.put("A", "test1");
map.put("C", "test3");
map.put("E", "test5");
map.put("B", "test2");
map.put("D", "test4");
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.