繁体   English   中英

从ArrayList中删除对象

[英]Remove Object From ArrayList

我有一个ArrayList和一个TreeSet拥有相同的对象类型。

TreeSet<StatusChangeDB> listToChange;
List<StatusChangeDB> originalList;

StatusChangeDB看起来像...

public class StatusChangeDB implements Comparable<StatusChangeDB> {


    private String sector;
    private String superlayer;
    private String loclayer;
    private String locwire;
    private String problem_type;
    public StatusChangeDB() {
    }
...
...
getters and setters
hashCode()
equals(Object)
compareTo(...)
}

当生成原始列表时,对象StatusChangeDB具有其原始类型的5个集合中的4个,即扇区,超层,loclayer,locwire。 原始列表显示在实现AbstractTableModel的JTable中。

在过程中的某个时刻,用户从显示的表中选择行,并分配“ problemType”,这将创建TreeSet listToChange。

现在,一旦“ problemType”被“设置”,我想从JTable中删除选择的值。 为此,我不能使用直线

originaList.removeAll(listToChange)

因为对象因“ problemType”而不同。

我已经在TableModel中尝试了此方法

public void removeRow(TreeSet<StatusChangeDB> listToChange) {
    //this.wireList.removeAll(statusChangeDBs); Does not work 
    //because objects are different
    for (StatusChangeDB row : listToChange) {
        for (StatusChangeDB statusChangeDB : originalList) {

            if (statusChangeDB.getSector().equals(row.getSector())
                    && statusChangeDB.getSuperlayer().equals(row.getSuperlayer())
                    && statusChangeDB.getLoclayer().equals(row.getLoclayer())
                    && statusChangeDB.getLocwire().equals(row.getLocwire())) {
                System.out.println("####### EQUAL #######");

                System.out.println(ro.getSector() + "  " + ro.getSuperlayer() + "  " + ro.getLoclayer() + "  "
                        + ro.getLocwire());
                 this.originalList.remove(statusChangeDB);
            }
        }
    }

此方法可以找到彼此相等的值,但是

         this.originalList.remove(statusChangeDB);

产生错误

java.util.AbstractList $ Itr.remove(AbstractList.java:374)处的线程“ AWT-EventQueue-0”中的异常java.util.AbstractList.remove(AbstractList.java:161)处的java.lang.UnsupportedOperationException。 util.AbstractCollection.remove(AbstractCollection.java:293)在database.ui.TableModel.removeRow(TableModel.java:95)

我已经阅读了SO论坛,但是由于无法动态添加ArrayList,因此无法使用Arrays.asList构造ArrayList。 如何完成从ArrayList中删除对象的任务? 请不要对使用DefaultTableModel而不是AbstractTable Model进行评论。 该项目的“全知”负责人已请求AbstractTableModel。

设置originalList的代码如下:

public void setWireSet(Dataset<StatusChangeDB> wireDF) {
    setWireList(wireDF.collectAsList());
    updateTable();
}

public void setWireList(List<StatusChangeDB> wireList) {
    this.originalList = wireList;
}

这两个列表均已填充,并且在转储到屏幕时会分配适当的值。

如果TableModel为

private List<StatusChangeDB> originalList;
private String[] colNames = { "Sector", "SuperLayer", "Layer", "Wire" };

public TableModel() {
    this.originalList = new ArrayList<StatusChangeDB>();
}

您收到此错误是因为您在打电话

 this.originalList.remove(statusChangeDB);

在for循环中,该循环将使用该列表的迭代器。

将要删除的值添加到临时Arraylist中,然后在循环完成执行后将其删除。

有类似的东西

for (StatusChangeDB row : listToChange) {

 ArrayList<StatusChangeDB> tempList = new ArrayList();
    for (StatusChangeDB statusChangeDB : originalList) {

        if (statusChangeDB.getSector().equals(row.getSector())
                && statusChangeDB.getSuperlayer().equals(row.getSuperlayer())
                && statusChangeDB.getLoclayer().equals(row.getLoclayer())
                && statusChangeDB.getLocwire().equals(row.getLocwire())) {
            System.out.println("####### EQUAL #######");

            System.out.println(ro.getSector() + "  " + ro.getSuperlayer() + "  " + ro.getLoclayer() + "  "
                    + ro.getLocwire());

  tempList.add(statusChangeDB);

        }


    }

this.originalList.removeAll(tempList);

}

更新

保持上述实施

public void setWireList(List<StatusChangeDB> wireList) {
this.originalList = wireList;
}

应该

 public void setWireList(List<StatusChangeDB> wireList) {
this.originalList.addAll(wireList);
 }

假设

public TableModel() {
this.originalList = new ArrayList<StatusChangeDB>();

}

之前被称为

public void setWireList(List<StatusChangeDB> wireList) {
this.originalList = wireList;
}

首先,您将获得UnsupportedOperationException因为您的List实现不支持删除。 为了避免这种情况,只需创建一个ArrayList <>:

List<StatusChangeDB> originalList = new ArrayList<>( Arrays.asList(sourceList) );

其次,要通过某些字段集删除对象(而不是在removeRow方法中显式定义此逻辑),只需在StatusChangeDB中覆盖equals方法即可比较这些字段:

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    StatusChangeDB other = (StatusChangeDB) obj;
    return Objects.equals(sector, other.sector) && Objects.equals(superlayer, other.superlayer)
            && Objects.equals(loclayer, other.loclayer) && Objects.equals(locwire, other.locwire);
}

有两种类型的数组列表。 常规的,而Arrays帮助器的是不可修改的。

从数组创建您的arraylist期间,而不是执行

this.originalList=Arrays.asList(pArray);

使用不可修改的假ArrayList,执行

this.originalList=new ArrayList(Arrays.asList(pArray));

确保重做导入,因为您可能具有ArrayList的命名空间类

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM