java - 更改变量也会更改先前分配的变量

标签 java arrays sorting binary-search-tree

我确定这是一个基本的逻辑错误,但我似乎无法修复它。在使用未排序(后序)和排序(中序)列表创建树之前,我正在对 GenericSimpleArrayList 进行排序。当我对其中一个列表进行排序时,它会同时对它们进行排序吗?我不确定为什么。

public static <AnyType extends Comparable<? super AnyType>> BinaryNode<AnyType>constructBST ( GenericSimpleArrayList<AnyType> postorder ){


    GenericSimpleArrayList <AnyType> g = postorder;

    quicksort(postorder, new SortFunctor()); //this is where i sort the list.

    GenericSimpleArrayList <AnyType> inorder = postorder;
    return constructTree(inorder, g);

}

谁能帮我解决这个问题?当我只对后序进行排序时,为什么它同时对 g 和后序进行排序?谢谢。

编辑:添加了 constructTree。

public static <AnyType> BinaryNode<AnyType> constructTree(GenericSimpleArrayList<AnyType> inorder, GenericSimpleArrayList<AnyType> postorder) {
    int nodes = postorder.size();

    AnyType root = postorder.get(nodes-1);
    BinaryNode<AnyType> left = null;
    BinaryNode<AnyType> right = null;

    if (nodes > 1) {
        int rootPos = 0;
        for (int loop = 0; loop <= nodes-1; loop++) {

            if (inorder.get(loop).equals(root)) {
                rootPos = loop;
                //System.out.println(loop);
            } else {
                //System.out.println("Not found at pos: " + loop);
            }
        }

        if (rootPos != 0) {
            GenericSimpleArrayList <AnyType> leftInorder = new GenericSimpleArrayList();//(AnyType) new Object[rootPos];
            GenericSimpleArrayList <AnyType> leftPostorder = new GenericSimpleArrayList();//(AnyType[]) new Object[rootPos];
            for (int loop = 0; loop < rootPos; loop++) {
                leftInorder.add(inorder.get(loop));
                leftPostorder.add(postorder.get(loop));
            }
            left = constructTree(leftInorder, leftPostorder );
        }

        if (rootPos < nodes-1){
            GenericSimpleArrayList <AnyType> rightInorder = new GenericSimpleArrayList();//(AnyType[]) new Object[nodes - rootPos - 1];
            GenericSimpleArrayList <AnyType> rightPostorder = new GenericSimpleArrayList();//(AnyType[]) new Object[rightInorder.length];
            for (int loop = 0; loop < nodes-rootPos-1; loop++){
                rightInorder.add(inorder.get(rootPos + loop + 1));
                rightPostorder.add(postorder.get(rootPos + loop));
            }

            right = constructTree(rightInorder, rightPostorder);
        }


    }

    return new BinaryNode<AnyType>(root, left, right);

}

最佳答案

Why does it sort both g and postorder when I only sort postorder?

GenericSimpleArrayList <AnyType> g = postorder;

postorder 是对对象的引用。当您复制此引用 时,您现在有两个引用 到一个对象。但是仍然只有一个对象。

我不知道您的自定义 ArrayList 的 API,但我想您可以做到

GenericSimpleArrayList<AnyType> g = new GenericSimpleArrayList<AnyType>(postorder);

GenericSimpleArrayList<AnyType> g = new GenericSimpleArrayList<AnyType>();
for(AnyType at: postorder)
    g.add(at);

您的排序实用程序很可能会就地对集合进行排序。这对于 sort 函数改变原始列表是很常见的。

如果要保留原始顺序并对列表进行排序,我建议先复制列表。

一种替代方法是使用不同的结构,如 TreeMap 来记录排序后的字符串和原始位置的索引。

关于java - 更改变量也会更改先前分配的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32946792/

相关文章:

javascript - 选择数组javascript中的最后一项

ios - 快速获取 nsdictionary 的所有键按字母顺序排序?

javascript - 如何按第二个数组降序对多维数组进行排序?

java - TableView 在过滤之前不显示数据

java - 如何在jmeter中将参数作为变量发送?

java - Java中数组太小怎么办?

javascript - 将数组值与对象键进行比较并将值设置为数组

java - 无法转换项目 : C:\workspace_IntelliJ\Main\new-webapp\. idea\workspace.xml:第 1 行错误:序言中不允许内容

c++ - 为什么这些数组在本地时起作用,而在全局时却不起作用?

java - 具有指定 z 索引值的最佳渲染绘制顺序函数