奇数HashMap计数器行为

时间:2011-07-22 13:02:00

标签: java if-statement hashmap jlist

我有这个代码,它将一个计数器应用于列表中的每个项目。当项目达到某个数字时,它将从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项和第2项,它们都达到了最大数量,1次被移动2次停留(没有增加计数),第3项获得+1到计数器

2 个答案:

答案 0 :(得分:1)

从jList3中删除元素时,后面的元素会被移位。 我会对选择数组进行排序并以相反的顺序扫描它。

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

UPDATE:不需要排序,因为getSelectedIndices()返回的数组已经是

答案 1 :(得分:1)

问题是您要在与查询它相同的循环中修改其中一个模型列表。如果您使用的是迭代器,您实际上会获得并发修改异常,但因为您正在使用特定的索引。在任何一种情况下,您的逻辑现在都是错误的,因为您依赖查询列表的索引已更改。您可以按降序对选择数组进行排序,并保持代码的原样,但我认为在完成循环后修改源数组会更清晰,更易于维护,如下所示: / p>

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

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

for(Object o : listModel) {
    listModel2.removeElement(o);
}