gpt4 book ai didi

java - 从 ArrayList 中移除对象

转载 作者:行者123 更新时间:2023-11-30 06:06:14 25 4
gpt4 key购买 nike

我有一个 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 个,即扇区、 super 层、lolayer、locwire。 originalList 显示在实现 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);

产生错误

Exception in thread "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 是动态添加的。如何完成从 ArrayList 中删除对象的任务?请不要评论使用 DefaultTableModel 而不是 AbstractTable 模型。项目的“无所不知”的领导者请求了 AbstractTableModel。

设置originalList的代码如下:

public void setWireSet(Dataset<StatusChangeDB> wireDF) {
setWireList(wireDF.collectAsList());
updateTable();
}

public void setWireList(List<StatusChangeDB> wireList) {
this.originalList = wireList;
}

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

originalList的赋值是if TableModel as

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

关于java - 从 ArrayList 中移除对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44685930/

25 4 0