遍历 jList 索引以删除项目

Loop through jList indices to remove items

我尝试遍历 jList 中我 selected 项目的索引以删除它们。

int[] indexoptio;
    indexoptio = this.list_optio.getSelectedIndices();

    for (int i=0; i<indexoptio.length ; i++) {
        this.optio.remove(indexoptio[i]);}
    this.list_optio.setModel(optio);

它工作完美,除非我的列表中只有 2 个项目。当我 select 两项时,它只会删除其中一项...

这是因为在处理一组引用它的索引时更改数据结构。使用示例更容易显示这一点。假设您有一个包含 3 个元素的列表 items

["item1", "item2", "item3"]

并且您想删除第 1 项和第 3 项,使用上面的代码,您实际正在做的是:

items.remove(0);
items.remove(2);

第一次删除后,列表变成了这样:

["item2", "item3"]

看看 "item3" 现在是第 1 位,而以前是第 2 位?

您选择的索引列表参考原始数据列表,但在第一个删除列表更改后

我认为以下内容对您有用:

int[] indexoptio;
indexoptio = this.list_optio.getSelectedIndices();

for (int i=0 ; i<indexoptio.length ; i++) {
    this.optio.remove(indexoptio[i]-i);
}
this.list_optio.setModel(optio);

每次迭代原始列表的大小都会减少 1,并且一些元素会向下移动,因此通过减去循环计数器 (indexoptio[i]-i) 它应该使值保持同步