关于java:获取Hashmap前3个键

Get Hashmap Top 3 Keys

我有一个哈希图来存储文本中出现的字符数。我试图打印出前三个事件,但打印错误。

1
2
3
4
5
6
7
8
9
10
int max = 1000000000;
for (int i = 1; i <= 3; i++) {
    for (Character key : list.keySet()) {
        if (list.get(key) < max) {
            max = list.get(key);
            System.out.println(i +":" + key +"" + list.get(key));
            break;
        }
    }
}


使用Java 8,您可以使用下面的代码(*):

1
2
3
4
List<Entry<Character, Integer>> top3 = map.entrySet().stream()
                                    .sorted(comparing(Entry::getValue, reverseOrder()))
                                    .limit(3)
                                    .collect(toList());

(*)具有以下导入:import static java.util.Comparator.comparing;。江户十一〔一〕号埃多克斯1〔2〕


您可以将程序修改为此表单:

1
2
3
4
5
6
7
8
9
10
11
12
for (int i = 1; i <= 3; i++) {
    int max = -1;
    Character maxKey = 'a';
    for (Character key : list.keySet()) {
        if (list.get(key) > max) {
            max = list.get(key);
            maxKey = key;
        }
    }
    System.out.println(i +":" + maxKey +"" + max );
    list.remove(maxKey);
}


这里有一个使用Java 8流的解决方案,它基于@ AssiLIAS提供的一个解决方案。它执行完整的任务,将字符串中的字符计数收集到映射中,并选择前3个条目。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.util.ArrayList;
import static java.util.Comparator.*;
import java.util.List;
import java.util.Map.Entry;
import static java.util.stream.Collectors.*;

public class Stream {

    public static void main(final String[] args) {
        final String text ="hello stackoverflow, let's count these character occurrences!";
        final char[] charArray = text.toCharArray();
        final List<Character> characters = new ArrayList<Character>(text.length());
        for (final char c : charArray) {
            characters.add(c);
        }

        final List<Entry<Character, Long>> top3 = characters.stream()
                .collect(groupingBy(Character::charValue, counting()))
                .entrySet().stream()
                .sorted(comparing(Entry::getValue, reverseOrder())).limit(3).collect(toList());

        System.out.println(top3);
    }
}

输出:

1
[e=8, c=7,  =6]


您需要按出现次数对条目进行排序,并获得前3个:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
List<Entry<Character, Integer>> entryList = new ArrayList<>(list.entrySet());
Collections.sort(entryList, new Comparator<Entry<Character, Integer>>(){
    @Override
    public int compare(Entry<Character, Integer> e1, Entry<Character, Integer> e2) {
        return e2.getValue() - e1.getValue(); // descending order
    }
});

// now let's get the top 3
List<Character> top3 = new ArrayList<>(3);
for(Entry<Character, Integer> e : entryList) {
    top3.add(e.getValue());
    if(top3.size() == 3) {
        break;
    }
}