java - 所有列表变量中的设置值都在更新

标签 java arraylist linked-list set

我有一个复杂的结构,例如

ArrayList<LinkedList<Struct>>

在我的主类中,我有 2 个嵌套类,如下所示

  static class struct {

            private String name;
            Set<String> rights = new HashSet<String>();
//getters and setters
    }
    static class Graph {
            ArrayList<LinkedList<struct>> adjListArray;

            Graph() {
                adjListArray = new ArrayList<>();
            }
        }

addEdge函数

    static void addEdge(Graph graph, String src, String dest, Set<String> rights) {
// code for creating a src block if it is not present and adding dest to it as below
    struct destStruct = new struct();
            destStruct.setName(dest);
            destStruct.setRights(rights);
            graph.adjListArray.get(getIndexOf(graph, src)).add(destStruct); // getIndexof is a function which will return the list index whose first element name is equal to src
    }

我从主函数传递这些值

public static void main(String args[]) {
        Graph graph = new Graph();
        Set<String> rights = new HashSet<String>();
        rights.add("T");
        rights.add("G");
        addEdge(graph, "A", "V", rights);
        rights.clear();
        rights.add("G");
        addEdge(graph, "B", "V", rights);
        printGraph(graph);
}

打印图形函数

static void printGraph(Graph graph) {
        for (LinkedList<struct> list : graph.adjListArray) {
            for (struct var : list) {
                System.out.println(
                        "src=" + list.get(0).getName() + " dest=" + var.getName() + " rights=" + var.getRights());
            }
            System.out.println("\n");
        }
    }

输出为

src=A dest=A rights=[]
src=A dest=V rights=[G]


src=B dest=B rights=[]
src=B dest=V rights=[G]

但预期输出是

src=A dest=A rights=[]
src=A dest=V rights=[T, G]


src=B dest=B rights=[]
src=B dest=V rights=[G]

我不明白为什么边缘(A,V)的权利被更新为(B,V)的权利。当我仅从 main 发送 (A,V) 时,我得到的值正确为

src=A dest=A rights=[]
src=A dest=V rights=[T, G]

想了解为什么会发生这种情况以及如何解决这个问题?

最佳答案

List.clear()

clear() 将遍历底层数组并将每个条目设置为 null。

使用rights.clear() 您已删除了指向 :- 的引用

rights.add("T");        
rights.add("G");

图表中,您必须为您的更改创建新的权限副本才能显示,否则使用clear()将从内存中删除所有现有引用。

更新addEdge方法:-

static void addEdge(Graph graph, String src, String dest, Set<String> rights) {
           Set<String> copyRights = new HashSet<>(rights); //create a new copy of rights.
            struct destStruct = new struct();
                    destStruct.setName(dest);
                    destStruct.setRights(copyRights);
                    graph.adjListArray.get(getIndexOf(graph, src)).add(destStruct); // getIndexof is a function which will return the list index whose first element name is equal to src
}

关于java - 所有列表变量中的设置值都在更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58897692/

相关文章:

java - 在 JRE(1.8) 上运行 Java 项目时出现 "A fatal error has been detected by the Java Runtime Environment: "

java - Swing:动态改变组件的可见性

java - 在 Java 5 中实现 ListeningExecutorService

无法解决无限循环

java - 两个链表求和时如何余数进1?

c++ - 如何修复我的链表读取不一致?

java - C++/C/Java : Anagrams - from original string to target;

C++ |如何在函数结果中返回所有 PID?

python - 尝试将类(在列表中)保存到文件中

java - 生成除特定值以外的随机数