在Map中获取最少值

时间:2014-02-07 03:41:58

标签: java

我不知道如何在最少发生的地图中获取值。

问题:

  

编写一个方法rarest,它接受一个映射,其键是字符串,其值是整数作为参数,并返回在映射中出现最少次数的整数值。如果存在平局,则返回较小的整数值。如果地图为空,则抛出异常。

     

例如,假设地图包含来自学生姓名的映射   (字符串)到他们的年龄(整数)。你的方法将返回最少   经常发生的年龄。考虑包含的映射变量m   以下键/值对:

     

{Alyssa = 22,Char = 25,Dan = 25,Jeff = 20,Kasey = 20,Kim = 20,Mogran = 25,   Ryan = 25,Stef = 22}三个人20岁(Jeff,Kasey和Kim),两个   人们年龄22岁(Alyssa和Stef),四个人年龄25岁(Char,   Dan,Mogran和Ryan)。因此,rarest(m)的调用仅返回22   两个人都是那个年龄。

     

如果有平局(两个或更多的拉雷斯年龄   发生的次数相同),返回最年轻的年龄   他们。例如,如果我们在地图上添加另一对Kelly = 22   以上,现在将有三个20岁的人(杰夫,   Kasey,Kim)和三个22岁的人(Alyssa,Kelly,Stef)。那么一个   rarest(m)的召唤现在将返回20,因为20是较小的   最稀有的价值观。

现在我相信这段代码给了我最小的int数,但是我如何得到这个值呢?

public static int rarest (Map<String, Integer> map) {
    List<Integer> list = new ArrayList<Integer>();
    for(Integer i: map.values()) {
        list.add(i);
    }
    int min = 0, count = 0;
    for(Integer i: list) {
        count = Collections.frequency(list, i);
        if(count < min) {
            min = count;
        }
    }
    return min;  
}

2 个答案:

答案 0 :(得分:1)

跟踪i的值,该值对应于最低计数min。这应该看起来很熟悉:

public static int rarest (Map<String, Integer> map) {
    List<Integer> list = new ArrayList<Integer>();
    for(Integer i: map.values()) {
        list.add(i);
    }
    int min = Integer.MAX_VALUE, rarestValue = 0;
    for(Integer i: list) {
        int count = Collections.frequency(list, i);
        if(count < min || (count == min && i < rarestValue)) {
            min = count;
            rarestValue = i;
        }
    }
    return rarestValue;  
}

答案 1 :(得分:0)

这样做,

public static int rarest (Map<String, Integer> map) {

    List<Integer> list = new ArrayList<>(map.values());
    Collections.sort(list); // you need to sort the list first
    int min = list.get(0); // this is your bug, min shouldn't start at 0
    int count = 0, rarest = 0;
    for(Integer i: list) {
        count = Collections.frequency(list, i);
        if(count < min) {
            min = count;
            rarest = i;
        }
    }
    return rarest;  
}
  1. 你的错误是min不应该在0处初始化,而是在列表的第一个值
  2. 如果您没有先排序,如果出现平局,您不一定会得到最年轻的