从哈希图中的数组列表中删除对象

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 问答。