[英]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.