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的时候,又不知道怎么回事,失去了排序功能,大家帮我看看怎么回事!感谢。
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<>(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
您的代码将中断。交换 o1
和 o2
就像在这段代码中所做的那样 可以更好地完成这项工作。【参考方案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排序的问题的主要内容,如果未能解决你的问题,请参考以下文章