我有一个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>();
}
答案 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
的命名空间类