如何使用数字的String键对Java中的Map进行排序

时间:2014-08-27 07:04:33

标签: java map

我创建了一个名为result的地图。

sortByKeys方法中,因为我的键是带有数字值的字符串,我已将它们转换为整数键类型Map然后对它们进行排序。

当我单独循环和打印时,排序工作正常,但是当我在另一个Map中设置它们时却没有。

public class TestDate {
    public static void main (String args[]){

    Map<String, String> result = new HashMap<String, String>();

        result.put("error", "10");
        result.put("1","hii");
        result.put("Update","herii");
        result.put("insert","insert");
        result.put("10","hiiuu");
        result.put("7","hii");
        result.put("21","hii");
        result.put("15","hii"); 

        Map<String, String> sorted = sortByKeys(result);
        //System.out.println(sorted);   
    }

    private static Map<String, String> sortByKeys(Map<String, String> map) {
        Map <Integer,String> unSorted = new  HashMap<Integer, String>();
        Map <String,String> sorted = new  HashMap<String, String>();
        for (Map.Entry<String, String> entry : map.entrySet())
        {
            try{
                int foo = Integer.parseInt(entry.getKey());            
                unSorted.put(foo, entry.getValue());                
            }catch (Exception e){

            }
        }
        Map<Integer, String> newMap = new TreeMap<Integer, String>(unSorted); 
        Set set = newMap.entrySet();
        Iterator iterator = set.iterator();
        while(iterator.hasNext()) {
            Map.Entry me = (Map.Entry)iterator.next();
            System.out.println(me.getKey());
            System.out.println(me.getValue());
            sorted.put(me.getKey().toString(),  me.getValue().toString());

       }
        System.out.println(sorted);

        return null;
    }   
}

这是o / p:

1
hii
7
hii
10
hiiuu
15
hii
21
hii
{21=hii, 10=hiiuu, 1=hii, 7=hii, 15=hii}

3 个答案:

答案 0 :(得分:5)

如果您不需要最后一英寸的性能,您可以使用SortedMap

直接解决此问题,而无需额外的步骤来对地图进行排序
Map<String,String> result = new TreeMap<>(Comparator.comparingInt(Integer::parseInt));

如果您是仍被拒绝访问Java 8的不幸群体之一,那么您必须长期实施Comparator

new TreeMap<>(new Comparator<String,String> { public int compare(String a, String b) {
  return Integer.compare(Integer.parseInt(a), Integer.parseInt(b));
}});

上述方法仅在假设所有键都是可解析整数的情况下才起作用。如果情况并非如此,那么您将无法直接使用SortedMap,但会将原始地图转换为其中,过滤掉不可解析的密钥。

答案 1 :(得分:2)

这是因为您将它们放入的MapHashMap,但未对其进行排序。即使您按照正确的顺序输入结果,也无法保证您将从HashMap中获得结果的排序。

(调用它sorted不会改变任何东西:))

答案 2 :(得分:1)

您打印2个不同地图而不是相同:您迭代并打印newMap地图的条目,最后打印sorted地图。

您会看到已打印的已排序条目,因为您会对已排序的newMap进行迭代。

然后打印未排序sorted地图(尽管名称不同)。您打印不同的地图实例。

打印此:

System.out.println(newMap); // This is the instance of the sorted "TreeMap"