使用Java对HashMap类按值进行排序

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());
                }
            }
        }
    }
}
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());
    }
});

+1:您使用了我在答案中提出的Entry类。聪明。 - SJuan76

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);
        }
      }
    }
  }
}

1

您不能直接从Map中操作。需要先获取键/值对,将所有地图数据存储在更适合的结构中(提示:一个类封装了两个属性,并存储在可排序的集合中(提示2:SortedSetList)),然后进行排序。

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


0

这是从https://dev59.com/b2sz5IYBdhLWcg3wFUC_#13913206中找到的其中一个解决方案

只需传入未排序的映射,您将得到已排序的映射。

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());
    }
}

0

你可能使用了错误的数据结构来解决这个问题。可以尝试以下两种方法:

  1. 将整数作为键,单词作为值,反转映射,并将其转换为 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);
}

Guava双向Map

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"

我只是好奇,你的字符串是用哪种语言编写的?


土耳其语——总是人们解释String.toUpperCase()的最喜欢的例子。 - Eric Jablow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接