从哈希图中的数组列表中删除对象
Remove an Object from an arraylist in a hashmap
我需要你的帮助,
我创建了这两个 classes
public class Arch <N,T>{
T label;
N start;
N end;
...constructor...
public class Graph <N,T>{
private ArrayList<N> nodes;
private HashMap<N,ArrayList<T>> arch; //for each Node I have saved an arrayList of Archs
//connected to him
private int nNode;
private int nArch;
private boolean oriented;
...constructor..
我需要Graph中的一个方法来删除一个Arch
来自我在 hashmap 中的 ArrayList。
我在 class 图表中这样尝试过:
public void deleteArch(N start, N end){
ArrayList<Arch<N,T>> archsForNode=(ArrayList<Arch<N,T>>)arch.get(start);
for(Arch<N,T> a : archsForNode){
if(a.start==start || a.end == end) {
archsForNode.remove(a);
}
}
}
但是当我在我的主测试中测试它时,结果是我的哈希映射中的 ArrayList 没有任何变化。
有人可以帮助我!
谢谢大家
我 90% 确定您的问题的根本原因是您的 classes 没有覆盖 Object#equals(Object)
和 Object#hashCode()
方法。为了使 remove()
函数起作用,它需要将传递给函数的对象与您正在迭代的集合的成员进行比较,以便删除等于参数的对象。
我建议您研究覆盖这些方法以正确实施。但是,总而言之,您的 classes 必须实现这些方法,并且在复杂 classes 的情况下(classes 包含其他对象引用)这些 classes 中的每一个必须覆盖这些方法。 class 之类的 String
在这些情况下起作用的原因是因为 String
class 覆盖了这些方法。对于您的自定义 classes,您必须执行相同的操作。从逻辑上考虑这个问题。如果代码无法确定哪些对象等于您要查找的对象,那么集合如何神奇地删除对象?
我怀疑 deleteArch
抛出一个 ConcurrentModificationException
因为你在修改 archsForNode
的同时遍历它:
for(Arch<N,T> a : archsForNode){
if(a.start==start || a.end == end) {
archsForNode.remove(a);
}
}
这是不允许的。
有关详细信息,请参阅 this 问答。
我需要你的帮助, 我创建了这两个 classes
public class Arch <N,T>{
T label;
N start;
N end;
...constructor...
public class Graph <N,T>{
private ArrayList<N> nodes;
private HashMap<N,ArrayList<T>> arch; //for each Node I have saved an arrayList of Archs
//connected to him
private int nNode;
private int nArch;
private boolean oriented;
...constructor..
我需要Graph中的一个方法来删除一个Arch 来自我在 hashmap 中的 ArrayList。
我在 class 图表中这样尝试过:
public void deleteArch(N start, N end){
ArrayList<Arch<N,T>> archsForNode=(ArrayList<Arch<N,T>>)arch.get(start);
for(Arch<N,T> a : archsForNode){
if(a.start==start || a.end == end) {
archsForNode.remove(a);
}
}
}
但是当我在我的主测试中测试它时,结果是我的哈希映射中的 ArrayList 没有任何变化。
有人可以帮助我!
谢谢大家
我 90% 确定您的问题的根本原因是您的 classes 没有覆盖 Object#equals(Object)
和 Object#hashCode()
方法。为了使 remove()
函数起作用,它需要将传递给函数的对象与您正在迭代的集合的成员进行比较,以便删除等于参数的对象。
我建议您研究覆盖这些方法以正确实施。但是,总而言之,您的 classes 必须实现这些方法,并且在复杂 classes 的情况下(classes 包含其他对象引用)这些 classes 中的每一个必须覆盖这些方法。 class 之类的 String
在这些情况下起作用的原因是因为 String
class 覆盖了这些方法。对于您的自定义 classes,您必须执行相同的操作。从逻辑上考虑这个问题。如果代码无法确定哪些对象等于您要查找的对象,那么集合如何神奇地删除对象?
我怀疑 deleteArch
抛出一个 ConcurrentModificationException
因为你在修改 archsForNode
的同时遍历它:
for(Arch<N,T> a : archsForNode){
if(a.start==start || a.end == end) {
archsForNode.remove(a);
}
}
这是不允许的。
有关详细信息,请参阅 this 问答。