【问题标题】:Java HashMap put in a for loop inJava HashMap 放入了一个 for 循环
【发布时间】:2011-05-02 20:37:08
【问题描述】:

我有一个for循环,我检查HashMap中是否有某个键,如果键不存在,它应该在HashMap中放置一个新的关联。问题是它放置了关联,但是在循环的下一次迭代中关联消失了!没看懂!

public void DrawBoard(ArrayList<Integer[]> BoardList, int FrameX, int FrameY){
    StdDraw.setCanvasSize(FrameX*50, FrameY*50);
    StdDraw.clear(new Color(0,0,0));
    StdDraw.setXscale(0, FrameX);
    StdDraw.setYscale(FrameY, 0);
    Map<Integer[], Color> Coloring = new HashMap<Integer[], Color>();
    for(int i = 0; i < BoardList.size(); i++){
        Integer[] Rectangle = BoardList.get(i);
        Random rand = new Random();
        Integer[] ColorCheck = {Rectangle[2], Rectangle[3]};
        if(Coloring.containsKey(ColorCheck)){
            StdDraw.setPenColor(Coloring.get(ColorCheck));}
        else{ 
        Color newColor = new Color(rand.nextInt(256), rand.nextInt(256), rand.nextInt(256));
        Coloring.put(ColorCheck, newColor);
        StdDraw.setPenColor(newColor);
        }
        double x1 = Rectangle[0];
        double y1 = Rectangle[1];
        double x2 = Rectangle[2];
        double y2 = Rectangle[3];
        StdDraw.filledRectangle(x1+(x2/2), y1+(y2/2), x2/2, y2/2);
    }
}

【问题讨论】:

  • 仅作记录,在 Java 中变量/成员通常是小写的。你有 .Net 背景?
  • 我没有背景,这是我在大学的第一个任务。因此,礼节略显凌乱。

标签: java for-loop hashmap


【解决方案1】:

正如 Nikita 所说,数组不实现逐个值的等于。它只是一个对象等于。

如果您想使用此实现,您应该使用带有自定义比较器(如 TreeMap)的 Map,并在该比较器的实现中使用例如 Arrays.equals。这样 colorCheck 的元素也会被检查(数组内容),而不是数组引用。

【讨论】:

  • 谢谢一百万,我只是使用了一个 ArrayList。
【解决方案2】:

Java 中的数组不提供equals 方法的实现。例如,array1.equals(array2) 将始终为 false,即使两个数组都包含相同数量的相同对象。因此,您不能将它们用作映射键:map.containsKey 将不起作用。

尝试使用列表:Arrays.asList(1, 2)。或者创建一个特殊的“pair”对象,因为数组中只包含两个元素。

【讨论】:

    猜你喜欢
    • 2015-03-08
    • 2021-10-11
    • 1970-01-01
    • 2018-12-27
    • 2020-04-14
    • 2012-05-23
    • 2013-07-02
    • 2013-08-04
    • 1970-01-01
    相关资源
    最近更新 更多