使用Java在HashMap类中按值排序

时间:2013-06-13 23:53:33

标签: java sorting collections map hashmap

我正在尝试按值对结果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());
                }
            }
        }
    }
}

5 个答案:

答案 0 :(得分: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());
    }
});

答案 1 :(得分:1)

你不能从Map那样做。至少不是直接的。

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

不要忘记扩展Comparable(并实施compareTo),否则请创建Comparator

答案 2 :(得分: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);
        }
      }
    }
  }
}

答案 3 :(得分: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());
    }
}

答案 4 :(得分:0)

您可能遇到此问题的错误数据结构。之一:

  1. 反转地图,以便整数是关键字和值,并使地图成为SortedMap
  2. 使用Google Guava等图书馆提供的双向地图。
  3. 反转地图

    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"
    

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