从ArrayList中删除Object

时间:2017-06-21 20:42:55

标签: java 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(...)
}

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

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

现在,我想在“problemType”为“set”后删除从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);

产生错误

  

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

我已经阅读了SO论坛,但是我无法使用Arrays.asList构造ArrayList,因为ArrayList是以dymnamically方式添加的。 如何完成从ArrayList中删除Object的任务? 请不要使用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为

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

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

3 个答案:

答案 0 :(得分:4)

您收到此错误是因为您正在调用

 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;
}

答案 1 :(得分:0)

首先,您获得了UnsupportedOperationException,因为您的List实施不支持删除。要避免这种情况,只需创建一个ArrayList&lt;&gt;:

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

答案 2 :(得分:0)

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

在从数组创建yuor arraylist期间,而不是执行

this.originalList=Arrays.asList(pArray);

使用immodifiable伪ArrayList,做

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

确保重做导入,因为您可能拥有ArrayList

的命名空间类