如何使用其值而不是键对树图进行排序?
问问题
82555 次
9 回答
24
这是一个解决方案:
public static <K, V extends Comparable<V>> Map<K, V> sortByValues(final Map<K, V> map) {
Comparator<K> valueComparator = new Comparator<K>() {
public int compare(K k1, K k2) {
int compare = map.get(k2).compareTo(map.get(k1));
if (compare == 0) return 1;
else return compare;
}
};
Map<K, V> sortedByValues = new TreeMap<K, V>(valueComparator);
sortedByValues.putAll(map);
return sortedByValues;
}
请注意,地图是从最高值到最低值排序的。
于 2010-01-21T20:49:09.470 回答
16
您不能因为 TreeMap 的比较器仅针对键运行,例如查看此构造函数。
无论如何,您可以使用多个集合,使用 TreeMap(或者更确切地说是 HashMap)通过键查找元素,并使用 SortedSet 对值进行迭代。
于 2009-09-19T11:35:02.927 回答
6
Google Guava 提供了TreeMultiMap。
您也可以使用两个集合。你想达到什么目的?你能解释一下你的用例吗?
于 2009-09-19T12:05:56.310 回答
5
Apache Commons Collections有一个TreeBidiMap:
此类保证映射将按键升序和值升序排列,根据键和值类的自然顺序进行排序。
这里有一个 Java5-generics 端口。
于 2009-09-19T11:31:58.673 回答
4
试试下面的代码,它对我来说很好。您可以选择升序和降序进行排序。
package com.rais;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
public class SortMapByValue
{
public static boolean ASC = true;
public static boolean DESC = false;
public static void main(String[] args)
{
// Creating dummy unsorted map
Map<String, Integer> unsortMap = new HashMap<String, Integer>();
unsortMap.put("B", 55);
unsortMap.put("A", 80);
unsortMap.put("D", 20);
unsortMap.put("C", 70);
System.out.println("Before sorting......");
printMap(unsortMap);
System.out.println("After sorting ascending order......");
Map<String, Integer> sortedMapAsc = sortByComparator(unsortMap, ASC);
printMap(sortedMapAsc);
System.out.println("After sorting descindeng order......");
Map<String, Integer> sortedMapDesc = sortByComparator(unsortMap, DESC);
printMap(sortedMapDesc);
}
private static Map<String, Integer> sortByComparator(Map<String, Integer> unsortMap, final boolean order)
{
List<Entry<String, Integer>> list = new LinkedList<Entry<String, Integer>>(unsortMap.entrySet());
// Sorting the list based on values
Collections.sort(list, new Comparator<Entry<String, Integer>>()
{
public int compare(Entry<String, Integer> o1,
Entry<String, Integer> o2)
{
if (order)
{
return o1.getValue().compareTo(o2.getValue());
}
else
{
return o2.getValue().compareTo(o1.getValue());
}
}
});
// Maintaining insertion order with the help of LinkedList
Map<String, Integer> sortedMap = new LinkedHashMap<String, Integer>();
for (Entry<String, Integer> entry : list)
{
sortedMap.put(entry.getKey(), entry.getValue());
}
return sortedMap;
}
public static void printMap(Map<String, Integer> map)
{
for (Entry<String, Integer> entry : map.entrySet())
{
System.out.println("Key : " + entry.getKey() + " Value : "+ entry.getValue());
}
}
}
于 2012-12-17T11:31:06.120 回答
1
您可以尝试在创建 TreeMap 时提供比较值而不是键的比较器。
final TreeMap<Integer,String> tree = new TreeMap<Integer,String>();
tree.put(1, "1");
tree.put(2, "2");
tree.put(3, "3");
tree.put(4, "4");
final TreeMap<Integer,String> treeSortedByValues = new TreeMap<Integer,String>(new Comparator<Integer>()
{
public int compare(Integer o1, Integer o2)
{
return tree.get(o1).compareTo(tree.get(o2));
}
});
treeSortedByValues.putAll(tree);
for ( Entry<Integer, String> e : treeSortedByValues.entrySet() )
{
System.out.println(e.getKey() + ": " + e.getValue());
}
于 2009-09-19T11:28:58.633 回答
0
交换值和键。
更严重的是,请提供一些您想要实现的背景。也许在其他处理完成后排序就足够了。
于 2009-09-19T11:28:56.947 回答
0
尝试这个。这会按升序对 TreeMap 值进行排序,假设这是您希望对值进行排序的方式。
static <K, V> Map<K, V> sortByValues(Map<K, V> map) {
List<?> list = new ArrayList(map.entrySet());
// copy Map to List to use Comparator
Collections.sort(list, new Comparator() {
public int compare(Object o1, Object o2) {
return ((Comparable) ((Map.Entry) o1).getValue()).compareTo(((Map.Entry) o2).getValue());
}
});
// then copy List to LinkedHashMap as it preserves insertion order
Map<K, V> result = new LinkedHashMap<K, V>();
Iterator itr = list.iterator();
while (itr.hasNext()) {
Map.Entry<K, V> m = (Map.Entry<K, V>) itr.next();
result.put(m.getKey(), m.getValue());
}
return result;
}
于 2020-05-27T12:21:35.007 回答
-1
我就是这样做的。。
package Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
class MyComparator implements Comparator<Object> {
public int compare(Object o1, Object o2) {
return (((Integer) o2).compareTo((Integer) o1));
}
}
class MyComparator1 implements Comparator<Object> {
Map<Integer, String> map;
public MyComparator1(Map<Integer, String> m) {
this.map = m;
}
public int compare(Object o1, Object o2) {
return (((String) map.get(o1)).compareTo((String) map.get(o2)));
}
}
public class Map1 {
public static void main(String[] args) {
Map<Integer, String> hmap = new HashMap<Integer, String>();
hmap.put(5, "Ashok");
hmap.put(21, "Bhanu");
hmap.put(7, "chaman");
hmap.put(28, "dheeraj");
hmap.put(761, "edison");
hmap.put(1, "frank");
hmap.put(-6, "gopal");
hmap.put(78, "hari");
System.out.println("Hash Map:" + hmap);
Map<Integer, String> tmap = new TreeMap<>(hmap);
System.out.println("Tree Map:" + tmap);
MyComparator comp = new MyComparator();
Map<Integer, String> itmap = new TreeMap<>(comp);
itmap.putAll(hmap);
System.out.println("Tree Map Inreverse order:" + itmap);
Map<Integer, String> orderValuemap = new TreeMap<Integer, String>(new
MyComparator1(hmap));
orderValuemap.putAll(hmap);
orderValuemap.put(22,"hello");
for(Entry<Integer, String> mp:orderValuemap.entrySet())
System.out.println("Value : "+mp.getValue());
}
}
于 2017-11-28T10:47:29.627 回答