5

我正在尝试获取按值排序的结果 HashMap。

这是 HashMap 的键和值:

map.put("ertu", 5);
map.put("burak", 4);
map.put("selin", 2);
map.put("can", 1);

我试图得到这样的结果:

1 = can
2 = selin
4 = burak
5 = ertu

这是我的代码:

import java.util.*;

public class mapTers {

    public static void main(String[] args) {

        HashMap<String, Integer> map = new HashMap<String, Integer>();

        map.put("ertu", 5);
        map.put("burak", 4);
        map.put("selin", 2);
        map.put("can", 1);

        Integer dizi[] = new Integer[map.size()];

        Set anahtarlar = map.keySet();

        Iterator t = anahtarlar.iterator();

        int a = 0;

        while (t.hasNext()) {
            dizi[a] = map.get(t.next());
            a++;
        }

        Arrays.sort(dizi);

        for (int i = 0; i < map.size(); i++) {
            while (t.hasNext()) {
                if (dizi[i].equals(map.get(t.next()))) {
                    System.out.println(dizi[i] + " = " + t.next());
                }
            }
        }
    }
}
4

5 回答 5

2

您可以按如下方式对条目进行排序(但请注意,这不会对地图本身进行排序,也HashMap无法排序) -

List<Map.Entry<String, Integer>> entryList = new ArrayList<Map.Entry<String, Integer>>(map.entrySet());
Collections.sort(entryList, new Comparator<Map.Entry<String, Integer>>() {
    @Override
    public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
        return o1.getValue().compareTo(o2.getValue());
    }
});
于 2013-06-13T23:58:33.187 回答
1

你不能从Map. 至少不是直接的。

检索键/条目,以更合适的结构获取所有地图数据(提示:封装两个属性并存储在可排序(提示2:,SortedSet)中的List类)并排序。

不要忘记扩展Comparable(和实现compareTo),否则,创建一个Comparator.

于 2013-06-13T23:58:26.850 回答
1

每次调用 t.next() 时,迭代器的指针都会向前移动。最终,迭代器到达终点。您需要重置迭代器。此外,调用 t.next() 两次会移动指针两次。

这是我的解决方案:

import java.util.*;
public class mapTers
{
  public static void main(String[] args)
  {
    HashMap<String, Integer> map = new HashMap<String, Integer>();
    map.put("ertu", 5);
    map.put("burak", 4);
    map.put("selin", 2);
    map.put("can", 1);
    Integer dizi[] = new Integer[map.size()];
    Set anahtarlar = map.keySet();
    Iterator t = anahtarlar.iterator();
    int a = 0;
    while (t.hasNext())
    {
      dizi[a] = map.get(t.next());
      a++;
    }
    Arrays.sort(dizi);
    for (int i = 0; i < map.size(); i++) 
    {
      t = anahtarlar.iterator();
      while (t.hasNext())
      {
        String temp = (String)t.next();
        if (dizi[i].equals(map.get(temp)))
        {
          System.out.println(dizi[i] + " = " + temp);
        }
      }
    }
  }
}
于 2013-06-14T00:06:59.530 回答
0

这是解决方案之一:https ://stackoverflow.com/a/13913206/1256583

只需传入未排序的地图,您就会得到已排序的地图。

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());
    }
}
于 2013-06-14T00:02:04.973 回答
0

对于这个问题,您可能有错误的数据结构。任何一个:

  1. 反转映射,使整数是键,单词是值,并使映射 a SortedMap,或
  2. 使用 Google Guava 等库提供的双向地图。

反转地图

private final SortedMap<Integer, String> TRANSLATIONS;
static {
    SortedMap<Integer, String> map = new TreeMap<>();
    map.put(1, "can");
    // ...
    TRANSLATIONS = Collections.unmodifiableSortedMap(map);
}

番石榴 BiMap

private final BiMap TRANSLATIONS =
   new ImmutableBiMap.Builder<String, Integer>()
        .put("ertu", 5);
        .put("burak", 4);
        .put("selin", 2);
        .put("can", 1);
        .build();

然后,根据需要迭代键集或值集的排序版本。例如,

TRANSLATIONS.inverse.get(4); // "burak"

我只是好奇。你的字符串是什么语言的?

于 2013-06-14T00:10:36.997 回答