如何打印出地图中最大的数字

时间:2016-10-26 15:32:46

标签: java

我正在阅读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

由于

3 个答案:

答案 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);