我正在阅读java中的地图。我想浏览一个不同数字的地图,并打印出地图中最大的3个数字。这是我的代码:
public class Test {
private static int number=0;
public static void main(String[] args) {
Map<String,Integer> m = new HashMap<String,Integer>();
m.put("haha", 1);
m.put("aa", 2);
m.put("rewq", 3);
m.put("la", 12);
m.put("oia", 10);
m.put("uyta", 4);
m.put("jpa", 5);
for (Entry<String, Integer> e : m.entrySet()) {
if (e.getValue() > number) {
number = e.getValue();
}
}
m.values().remove(number);
System.out.println(number);
for (Entry<String, Integer> e : m.entrySet()) {
if (e.getValue() > number) {
number = e.getValue();
}
}
m.values().remove(number);
System.out.println(number);
for (Entry<String, Integer> e : m.entrySet()) {
if (e.getValue() > number) {
number = e.getValue();
}
}
m.values().remove(number);
System.out.println(number);
}
}
输出
12
12
12
如何更改代码以使其打印如下:
12
10
5
由于
答案 0 :(得分:5)
您的代码存在的问题是您使用相同的条件在相同的数字上重复三次,而不重置最大找到的数字。您的代码基本上找到最大的数字,然后将地图中的每个项目与更大的数字进行两次比较。当然,它什么也没找到,并打印出以前找到的最大数字。
你更想要的是:
在Java中:
ArrayList<Integer> values = new ArrayList<Integer>(m.values());
Collections.sort(values);
// turn ascending to descending
Collections.reverse(values);
System.out.println(String.format("%d, %d, %d", values.get(0), values.get(1), values.get(2)));
排序所有值,即使您只需要前三个也是一些计算开销,但对于少于几千个条目的列表,它是可以忽略的。
答案 1 :(得分:3)
目前,您有一个最大值的变量,因此在程序结束时,您将始终打印最大的变量,因为您仍在将其与最大值进行比较。这就是您每次都获得相同价值的原因。您可以将所有数字读入arraylist,然后调用collections.sort方法并从中获取前3个并打印出来。
根据您目前的情况,您还可以执行以下操作
for(int i = 0; i < 3; i++)
{
//this makes sure you aren't comparing the same largest number everytime
number = Integer.MIN_VALUE;
for (Entry<String, Integer> e : m.entrySet()) {
if (e.getValue() > number) {
number = e.getValue();
}
}
m.values().remove(number);
System.out.println(number);
}
答案 2 :(得分:3)
您还可以使用Java 8功能来实现您想要的功能
Map<String,Integer> m = new HashMap<String,Integer>();
m.put("haha", 1);
m.put("aa", 2);
m.put("rewq", 3);
m.put("la", 12);
m.put("oia", 10);
m.put("uyta", 4);
m.put("jpa", 5);
m.values()
.stream()
.sorted(Comparator.reverseOrder())
.limit(3)
.forEach(System.out::println);