我有一个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)
您收到此错误是因为您在打电话
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)
| 归档时间: |
|
| 查看次数: |
214 次 |
| 最近记录: |