Java 获取映射中出现最少的值

Java 获取映射中出现最少的值,java,Java,我不知道如何在发生最少的映射中获取值 问题: 编写一个rarest方法,该方法接受键为字符串、值为整数的映射作为参数,并返回映射中出现次数最少的整数值。如果存在平局,则返回较小的整数值。如果映射为空,则引发异常 例如,假设映射包含来自学生姓名的映射 (字符串)到它们的年龄(整数)。您的方法将返回最小值 多发年龄。考虑包含变量的映射变量M 以下键/值对: {Alyssa=22,Char=25,Dan=25,Jeff=20,Kasey=20,Kim=20,Mogran=25, Ryan=25,Ste

我不知道如何在发生最少的映射中获取值

问题:

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

例如,假设映射包含来自学生姓名的映射 (字符串)到它们的年龄(整数)。您的方法将返回最小值 多发年龄。考虑包含变量的映射变量M 以下键/值对:

{Alyssa=22,Char=25,Dan=25,Jeff=20,Kasey=20,Kim=20,Mogran=25, Ryan=25,Stef=22}三个人20岁(杰夫、凯西和金),两个 人们的年龄是22岁(Alyssa和Stef),四个人的年龄是25岁(Char, 丹、莫格兰和瑞安)。因此,调用rarest(m)返回22,因为 两个人在那个年龄

如果有一条领带(两个或两个以上最稀有的年龄) 发生次数相同),返回其中最年轻的年龄 他们。例如,如果我们在地图上添加另一对Kelly=22 在上面,现在将有三个20岁的人(杰夫, 凯西,金)和三个22岁的人(艾莉莎,凯利,斯特夫)。那么 稀有调用(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;  
}
publicstaticint-rarest(映射){
列表=新的ArrayList();
对于(整数i:map.values()){
列表.添加(i);
    }
int min=0,count=0;
for(整数i:列表){
计数=集合。频率(列表,i);
如果(计数<分钟){
最小值=计数;
}
    }
返回最小值
}

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

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;  
}
publicstaticint-rarest(映射){
列表=新的ArrayList();
对于(整数i:map.values()){
列表.添加(i);
}
int min=Integer.MAX_值,最稀值=0;
for(整数i:列表){
int count=集合频率(列表,i);
if(count
像这样做

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;  
}
publicstaticint-rarest(映射){
列表=新的ArrayList(map.values());
Collections.sort(list);//首先需要对列表进行排序
int min=list.get(0);//这是您的错误,min不应该从0开始
整数计数=0,最稀有的=0;
for(整数i:列表){
计数=集合。频率(列表,i);
如果(计数<分钟){
最小值=计数;
稀有=i;
}
}
回报稀有;
}
  • 您的错误是min不应该初始化为0,而是初始化为列表的第一个值
  • 如果不先对列表进行排序,在平局的情况下,不一定会得到最小的

  • 这还需要处理一个tie,在这种情况下返回较小的整数。我不知道为什么,但它总是返回0。当它应该返回22时。那是因为代码中有一个小错误。我会编辑的。@Jason你的编辑不应该被那些人拒绝,对不起。@MattBall,真不错!非常感谢。我不知道Integer.MAX_值是什么,但我会在后面看。谢谢你指出代码中的错误。您的代码看起来干净易读。