JAVA:一个MAP排序的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA:一个MAP排序的问题相关的知识,希望对你有一定的参考价值。

private Map<String, Integer> mapSortByKey(Map<String, Integer> unsort_map)
Map<String, Integer> result = new HashMap<String, Integer>();

Object[] unsort_key = unsort_map.keySet().toArray();
Arrays.sort(unsort_key);

for (int i = 0; i < unsort_key.length; i++)
result.put(unsort_key[i].toString(), unsort_map.get(unsort_key[i]));


return result;


我的代码中有这么一个程序,主要是将MAP按KEY排序后返回,可是在最后的result.put的时候,又不知道怎么回事,失去了排序功能,大家帮我看看怎么回事!感谢。

HashMap里面的元素是无序的,要进行排序的话只能是用TreeMap和SortedMap,例如:
public static void main(String[] args) throws Exception
Map<String, Integer> map=new TreeMap<String, Integer>();
map.put("1", 1);
map.put("9", 9);
map.put("4", 4);
map.put("2", 2);
map.put("8", 8);
map=mapSortByKey(map);
System.out.println(map.toString());

private static SortedMap<String, Integer> mapSortByKey(Map<String, Integer> unsort_map)
TreeMap<String, Integer> result = new TreeMap<String, Integer>();

Object[] unsort_key = unsort_map.keySet().toArray();
Arrays.sort(unsort_key);

for (int i = 0; i < unsort_key.length; i++)
result.put(unsort_key[i].toString(), unsort_map.get(unsort_key[i]));

return result.tailMap(result.firstKey());
参考技术A 楼上正解。
你还可以尝试通过使用集合来排序。
connection静态类的sort方法,它的参数是个list。返回值是排序后的结果。

降序排序:Java Map

【中文标题】降序排序:Java Map【英文标题】:Sorting Descending order: Java Map 【发布时间】:2013-09-26 05:16:00 【问题描述】:

我想做的是按值对地图进行排序。我查看了 *** 网站上提供的许多问题,发现以下解决方案可以满足我的要求,但缺少一点小东西。

Link1: 排序图

但我遇到的问题是,默认情况下这是按值升序排序的。我想按降序排列:

所以我所做的是我创建了一个实现比较器的类

class MyComparator implements Comparator 
    Map map;
    public MyComparator(Map map) 
        this.map = map;
    
    public int compare(Object o1, Object o2) 
        return ((Integer) map.get(o2)).compareTo((Integer) map.get(o1));
    

然后我将我的地图传递给树形图,

MyComparator comp = new MyComparator(myMap);
Map<String, Integer> newMap = new TreeMap(comp);
newMap.putAll(myMap);

这似乎是一种不好的方法,因为我觉得这效率低下。有没有办法将链接中的解决方案更改为默认按降序排序。

【问题讨论】:

您会惊讶于效率低下和非效率低下。您应该运行一些测试...制作一张包含 50,000 个随机整数的地图并以这种方式排序,看看实际需要多长时间。 (并且这样做 100 次或更多,这样你就会得到一个很好的平均水平。)尽量不要去做你“觉得”效率低下的事情。 如果您真的阅读了链接答案中的 cmets,您会发现您使用的技术实际上是一个非常糟糕的主意。 ***.com/a/2581754/869736 是对这个问题的唯一普遍有效的答案。 【参考方案1】:

要将链接中的解决方案改为降序排序,只需反转条件即可:

...
// Note: this comparator imposes orderings that are inconsistent with equals.    
public int compare(String a, String b) 
    if (base.get(a) >= base.get(b)) 
        return 1; // For ascending, return -1;
     else 
        return -1; // For ascending, return 1;
     // returning 0 would merge keys

...

【讨论】:

【参考方案2】:

你应该使用new TreeMap&lt;&gt;(Collections.reverseOrder());

Map<String, Integer> newMap = new TreeMap<>(Collections.reverseOrder());
newMap.putAll(myMap);

或反转现有的比较器,例如值比较器Collections.reverseOrder(comparator)。它的工作方式类似于您在调用 compare/compareTo 之前交换两个对象的方法。

【讨论】:

【参考方案3】:

您可以通过在开头添加减号来简单地反转比较方法的返回值:

return -((Integer) map.get(o2)).compareTo((Integer) map.get(o1));

【讨论】:

非常糟糕的主意。如果 compareTo 返回 Integer.MIN_VALUE 您的代码将中断。交换 o1o2 就像在这段代码中所做的那样 可以更好地完成这项工作。【参考方案4】:
    TreeMap<Long,String> treeMap = new TreeMap<Long,String>();

    NavigableMap <Long, String> nmap = treeMap.descendingMap();

    Set<Long, String> set = nmap.entrySet();

    Iterator<Long, String> iterator = set.iterator();

现在你可以迭代迭代器并使用 iterator.hasNext() 和 iterator.next() 方法提取值......

【讨论】:

【参考方案5】:

这将起作用:

      TreeMap<Integer, Integer> reverseInteger=new TreeMap<>(new Comparator<Integer>() 

        @Override
        public int compare(Integer o1, Integer o2) 
            return o2>o1?1:o2==o1?0:-1;
        
    );

【讨论】:

以上是关于JAVA:一个MAP排序的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Java 中按键对 Map 值进行排序?

list<map> 排序,根据总分数排序,高手来,加分

Java中如何对Map的value或者key排序

降序排序:Java Map

Java Map 按值排序

python map按value排序