【问题标题】:overwriting in a List of 2D arrays覆盖二维数组列表
【发布时间】:2012-08-19 21:43:47
【问题描述】:

我有一个问题,我输入的数据写入列表中的所有元素而不是一个,我真的很难弄清楚原因,感谢任何人的帮助..

public class Courts implements Serializable {

private static final long serialVersionUID = 1;
List<String[][]> allCourts = new ArrayList<String[][]>(10);

}

这是我用来改变这个列表的方法

public String bookCourt(int courtNo,int day,int time) throws RemoteException{
    String [][] tmp = court.allCourts.get(courtNo - 1);

    if(tmp[day-1][time-1].equals("Available")){

        tmp[day-1][time-1] = logged.name;

        court.allCourts.set(courtNo - 1,tmp);
        return "Your booking has been accepted, booking is on (" + court.courtNames[courtNo - 1] + 
                                                               "),(" + court.days[day - 1] + ") at ("
                                                               + court.times[time - 1]  + ").\n";
    }

    return "Court already taken by " + tmp[day-1][time-1] + ".\n";
}

那里的格式有点不稳定,对此感到抱歉..

我认为这应该做的是从 courtNo-1 索引处的 allCourts 列表中获取 2D 数组,检查指定位置的字符串是否为“可用”以及是否将其设置为logged.name。

然后它应该使用这个更新的二维数组并用它覆盖列表中的数组,唯一的问题是它将名称或数组写入 allCourts 列表中的每个元素,我不知道为什么,再次感谢任何帮助你可以提供给我。

【问题讨论】:

    标签: java arrays list pass-by-reference


    【解决方案1】:

    我不确定它为什么会出现你提到的特定行为,因为在我看来,由于缺乏初始化,它看起来应该只是抛出 NullPointerExceptions。我猜在某个地方,您正在初始化allCourts,以便所有元素都是同一个数组。

    但是,有些事情要记住。在 Java 中,数组只是一个对象,就像其他任何东西一样。 tmp 是对数组对象的引用,该数组对象也被存储在allCourts 中位置courtNo-1 的引用所引用。调用 set 不会覆盖数组,它会覆盖数组引用,它已经等于tmp。所以court.allCourts.set(courtNo - 1,tmp); 什么都不做。

    【讨论】:

    • 嗨,对不起,我没有包含完整的代码,它已经初始化并充满了数据。所以基本上它覆盖了相同引用的引用,我仍然不明白为什么当我在其他地方遍历 List 时,它会显示我为列表中的每个数组输入的名称..
    • 您是否进行了测试以确保列表中的所有引用都指向不同的数组?
    • 我刚刚将数组复制到另一个数组并设置了那个,工作正常,谢谢。
    猜你喜欢
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多