Поведение счетчика Odd HashMap - PullRequest
0 голосов
/ 22 июля 2011

У меня есть этот код, который применяет счетчик к каждому элементу в списке. Когда элемент достигает определенного числа, он перемещается из jList3 в jList 1.

public Map<Object, Integer> buttonMap = new HashMap<Object, Integer>();
    private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {  

    Integer counter = null;
    int[] selection = jList3.getSelectedIndices();
     for (int i = 0; i < selection.length; i++){
        Object selString = jList3.getModel().getElementAt(selection[i]);
       counter = buttonMap.get(selString);      
        if(counter == null ) {           
            buttonMap.put(selString, new Integer(1));     
        }                                                                                                      
        else {
        buttonMap.put(selString, new Integer(counter.intValue() + 1)); 
        }           
        System.out.println(selString + " has been clicked " + buttonMap.get(selString) + " times.");                                      

       try{
        if (counter == 4){                          
           listModel2.removeElement(selString);
            listModel.addElement(selString);                             
        }
       }
        catch (NullPointerException npe1) {
        npe1.getMessage();
              }                                                                  
        }                                                   
  } 

Поведение описывается в разделе if counter == 4.

Работает нормально, но вот та странная часть, в которой мне нужна помощь для понимания

Если я считаю два предмета одновременно, и они оба достигают числа, которое перемещает их одним нажатием кнопки.

-Двигается 1 из предметов

-Это не считается на другом

-Заменяет +1 на счетчик невыделенного предмета

Пример:

Я рассчитываю на элементы списка 1 и 2, они оба достигают максимального числа, 1 перемещается, 2 остается на месте (без увеличения количества), а элемент 3 получает +1 к счетчику

Ответы [ 2 ]

1 голос
/ 22 июля 2011

Проблема в том, что вы изменяете один из своих списков моделей в том же цикле, в котором вы запрашиваете его. Если бы вы использовали итератор, вы бы фактически получили исключение одновременной модификации, но в действительности вы используете специальную индексацию. В любом случае ваша логика теперь неверна, потому что изменились индексы, на которые вы полагались при запросе списка. Вы можете отсортировать массив selection в порядке убывания и сохранить свой код таким, какой он есть, но я думаю, что будет проще и проще изменять исходный массив после завершения цикла, например:

...
    System.out.println(selString + " has been clicked " + buttonMap.get(selString) + " times.");

    if (counter == 4) {
        listModel.addElement(selString);
    }
}

for(Object o : listModel) {
    listModel2.removeElement(o);
}
1 голос
/ 22 июля 2011

Когда вы удаляете элемент из jList3, последующие элементы смещаются. Я бы отсортировал массив выбора и просканировал его в обратном порядке.

...
int[] selection = jList3.getSelectedIndices();
Arrays.sort(selection);
for (int i = selection.length; --i >= 0; ){
...

ОБНОВЛЕНИЕ: сортировка не требуется, потому что массив, возвращаемый getSelectedIndices (), уже равен

...