首页 > 解决方案 > 为什么节点被添加到错误的链表中?

问题描述

我的部分代码存在问题,我想将索引 0 处具有空字符串的行与不具有空字符串的行分开。虽然只需要行的索引和元素 1 的整数或元素 1 和 0 之间的差异。我决定使用两个链表来拆分每种类型的行,但我得到了一个奇怪的结果。不知何故,一行被添加到错误的链表中。

void Splitter () {
    String[][] databaseSchedule = {
        {"", "100", "129 East Fremont St, Las Vegas, NV 89101"},
        {"", "50", "770 N Las Vegas Blvd, Las Vegas, NV 89101"},
        {"", "300", "1610 E Tropicana Ave, Las Vegas, NV 89119"},
        {"1300", "1400", "755 E Flamingo Rd, Las Vegas, NV 89119"},
        {"", "200", "4650 Aspen Ave Mt Charleston, NV 89124"},
    };
    int[] subArray = new int[2];
    List<int[]> anyTimeStart = new LinkedList<>();
    List<int[]> strictTimeStart = new LinkedList<>();

    try {
        for (int i = 0; i < databaseSchedule.length; ++i) {
            if ("".equals(databaseSchedule[i][0])) {
                subArray[0] = i;
                subArray[1] = Integer.parseInt(databaseSchedule[i][1]);
                anyTimeStart.add(subArray);
            }
            else {
                subArray[0] = i;
                subArray[1] = Integer.parseInt(databaseSchedule[i][1]) -
                        Integer.parseInt(databaseSchedule[i][0]);
                strictTimeStart.add(subArray);
                System.out.println(Arrays.toString(strictTimeStart.get(0)));
                //Prints out [3, 100] which is expected.
            }
        }
        System.out.println(Arrays.toString(strictTimeStart.get(0)));
        //Prints out [4, 200], what happened?
    } catch (NumberFormatException ex) {
        System.out.println("String cannot be converted to integer");
    }
}

标签: java

解决方案


您只有一个数组实例:

int[] subArray = new int[2];

您将其添加到两个列表中。调用list.add(subArray)不会将副本添加subArray到列表中。subArray它添加对变量引用的同一数组的引用。因此,您的两个列表最终都包含对同一数组的多个引用。

在添加到列表之前创建一个新数组。例如:

    for (int i = 0; i < databaseSchedule.length; ++i) {
        subArray = new int[2];
        if ("".equals(databaseSchedule[i][0])) {
            subArray[0] = i;
            subArray[1] = Integer.parseInt(databaseSchedule[i][1]);
            anyTimeDuration.add(subArray);
        } else {
            subArray[0] = i;
            subArray[1] = Integer.parseInt(databaseSchedule[i][1]) -
                    Integer.parseInt(databaseSchedule[i][0]);
            strictTimeDuration.add(subArray);
            System.out.println(Arrays.toString(strictTimeDuration.get(0)));
        }
    }

推荐阅读