【问题标题】:Remove an Object from an arraylist in a hashmap从哈希图中的数组列表中删除对象
【发布时间】:2022-01-07 07:52:40
【问题描述】:

我需要你的帮助, 我创建了这两个类

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 来自我在哈希图中的 ArrayList。

我在类 Graph 中尝试过这样的:


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 没有任何变化。

谁能帮帮我!

谢谢大家

【问题讨论】:

    标签: java arraylist graph hashmap nodes


    【解决方案1】:

    我 90% 确定您的问题的根本原因是您的类没有覆盖 Object#equals(Object)Object#hashCode() 方法。为了使remove() 函数工作,它需要将传递给函数的对象与您正在迭代的集合成员进行比较,以便删除与参数相等的对象。

    我建议您研究覆盖这些方法以正确实施。但是,总而言之,您的类必须实现这些方法,并且在复杂类(包含其他对象引用的类)的情况下,这些类中的每一个都必须覆盖这些方法。像String 这样的类在这些情况下工作的原因是String 类覆盖了这些方法。对于您的自定义类,您必须这样做。从逻辑上思考这个问题。如果代码无法确定哪些对象与您要查找的对象相等,那么集合怎么能神奇地删除对象?

    【讨论】:

    • 我必须在 Arch 的类中覆盖这两个方法?
    • 要从覆盖equals 中受益,这个a.start==start 也必须改变。
    【解决方案2】:

    我怀疑deleteArch 会抛出ConcurrentModificationException,因为您在迭代archsForNode 时对其进行了修改:

       for(Arch<N,T> a : archsForNode){                                        
            if(a.start==start || a.end == end) {                                
                archsForNode.remove(a);                                         
            }                                                                                                                                             
        } 
    

    这是不允许的。
    更多信息见this问答。

    【讨论】:

    • 这也很重要。注意并发修改异常。在这些情况下,最好的办法是使用集合的 Iterator 并让它修改(在您的情况下删除)需要删除的集合成员。
    猜你喜欢
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    • 1970-01-01
    相关资源
    最近更新 更多