Java HashMap вставлен в цикл for - PullRequest
       18

Java HashMap вставлен в цикл for

0 голосов
/ 30 октября 2010

У меня есть цикл 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);
    }
}

Ответы [ 2 ]

2 голосов
/ 30 октября 2010

Как сказал Никита, массивы не реализуют равные значения по значению.Это просто объект равный.

Если вы хотите использовать эту реализацию, вы должны использовать Map с пользовательским компаратором (например, TreeMap) и использовать, например, Arrays.equals при реализацииэтот компаратор.Таким образом, элементы colorCheck также проверяются (содержимое массива), а не столько ссылка на массив.

2 голосов
/ 30 октября 2010

Массивы в Java не обеспечивают реализацию метода equals. Например, array1.equals(array2) всегда будет false, даже если оба массива содержат одинаковое количество одинаковых объектов. Поэтому их нельзя использовать в качестве ключей карты: map.containsKey не будет работать.

Попробуйте списки вместо: Arrays.asList(1, 2). Или создайте специальный объект 'pair', поскольку в массиве хранятся только два элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...