【问题标题】:Map in java - getting wrong map size [duplicate]Java中的地图-地图大小错误[重复]
【发布时间】:2018-08-16 18:34:19
【问题描述】:

我正在尝试了解 Map 接口在 Java 中的工作原理。我要做的是:遍历字符串数组,并为数组name[] 中的每个名称在0 到5 之间放置一个随机grade。然后将grade 映射到name[i]。但是,地图大小变得很奇怪,虽然我在数组中有 10 个元素,但映射后 map.size() 是 5。为什么程序多次计算相同的大小(见输出)?下面是代码和输出:

    import java.util.*;  

    class MapInterfaceExample{  

    public static void main(String[] args){  

    int grade = 0; 
    String[] name = {"Lisa", "Dan", "John", "Adam", "George", "Amanda", "Sarah", "James", "Derek", "Sam"}; 

    Map<Integer,String> map=new HashMap<Integer,String>();  

    for(int i=0; i<name.length; i++){
    grade = (int)(Math.random()*5+1); 
    map.put(grade, name[i]);  
    //System.out.println(grade + "\t"+ name[i]);  
    System.out.println("Size of map "+ map.size());}
    } 
    }

输出:

地图 1 的大小

地图 2 的大小

地图 2 的大小

地图 2 的大小

地图 2 的大小

地图 3 的大小

地图 3 的大小

地图 4 的大小

地图 4 的大小

地图5的大小

【问题讨论】:

  • 提示:地图不允许重复键。
  • 你确定成绩是关键吗?如果是,是否要收集所有成绩相同的姓名?
  • 看看map.put(name[i],grade);会发生什么样的魔法

标签: java


【解决方案1】:

为同一个键分配新值将覆盖旧值,因此如果您最多有 5 个不同的键 (1-5),则您的地图的最大大小为 5。

您应该使用名称作为键,因为它们是唯一的。然后几个学生可以有相同的成绩。

【讨论】:

  • @Kayaman,啊,谢谢,我明白现在发生了什么。大小由我从grade 获得的值触发。
  • @Pshemo,我如何得到 0-5?谢谢。
  • @Pshemo 没错,当然。
  • @sumu00 让我们从您现在拥有的开始:(int)(Math.random()*5+1);Math.random() 只能从[0;1) 范围内生成值(或者我们将其写为[0; 0.9999999...])。当我们将它乘以 5*[0;1) 时,它给了我们新的范围 [0; 4.9999999...]。添加+1 后范围变为[1; 5.99999999]。通过转换为(int),我们删除了.999... 部分,因此范围为[1; 5]。如果您想获得[0; 5],您可以在投射之前创建范围[0; 5.9999....]。要生成这样的范围,您需要6*[0; 0.99999...]。因此,可以使用int value = (int)(6*Math.random()) 生成来自该范围的值。
  • @Pshemo,这么好的答案!非常感谢!
【解决方案2】:

你使用成绩作为键

map.put(grade, name[i]);  

由于等级范围是[1, 5],所以地图不会大于5。

【讨论】:

  • 谢谢,现在我想通了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
相关资源
最近更新 更多