[英]Odd HashMap Counter Behavior
我有这个代码,它对列表中的每个项目应用一个计数器。 当项目达到一定数量时,它会从 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 反击
当您从 jList3 中删除一个元素时,后面的元素将被移动。 我会对选择数组进行排序并以相反的顺序扫描它。
...
int[] selection = jList3.getSelectedIndices();
Arrays.sort(selection);
for (int i = selection.length; --i >= 0; ){
...
更新:不需要排序,因为 getSelectedIndices() 返回的数组已经是
问题是您正在与查询它的同一循环中修改 model 列表之一。 如果您使用的是迭代器,您实际上会得到一个并发修改异常,但实际上您正在使用特定的索引。 无论哪种情况,您的逻辑现在都是错误的,因为您查询列表所依赖的索引已更改。 您可以按降序对选择数组进行排序并保持代码原样,但我认为在循环完成后修改源数组会更简洁,更易于维护,如下所示:
...
System.out.println(selString + " has been clicked " + buttonMap.get(selString) + " times.");
if (counter == 4) {
listModel.addElement(selString);
}
}
for(Object o : listModel) {
listModel2.removeElement(o);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.