从ArrayList中删除对象

mku*_*kel 2 java arraylist

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

TreeSet<StatusChangeDB> listToChange;
List<StatusChangeDB> originalList;
Run Code Online (Sandbox Code Playgroud)

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(...)
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

originaList.removeAll(listToChange)
Run Code Online (Sandbox Code Playgroud)

因为对象因“ 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);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

         this.originalList.remove(statusChangeDB);
Run Code Online (Sandbox Code Playgroud)

产生错误

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;
}
Run Code Online (Sandbox Code Playgroud)

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

如果TableModel为

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

public TableModel() {
    this.originalList = new ArrayList<StatusChangeDB>();
}
Run Code Online (Sandbox Code Playgroud)

tap*_*sey 5

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

 this.originalList.remove(statusChangeDB);
Run Code Online (Sandbox Code Playgroud)

在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);

}
Run Code Online (Sandbox Code Playgroud)

更新资料

保持上述实施

public void setWireList(List<StatusChangeDB> wireList) {
this.originalList = wireList;
}
Run Code Online (Sandbox Code Playgroud)

应该

 public void setWireList(List<StatusChangeDB> wireList) {
this.originalList.addAll(wireList);
 }
Run Code Online (Sandbox Code Playgroud)

假设

public TableModel() {
this.originalList = new ArrayList<StatusChangeDB>();
Run Code Online (Sandbox Code Playgroud)

}

之前被称为

public void setWireList(List<StatusChangeDB> wireList) {
this.originalList = wireList;
}
Run Code Online (Sandbox Code Playgroud)