【问题标题】:2d array list is automatically getting updated for all 2d array in the list with the last supplied 2d array in java二维数组列表会自动更新列表中的所有二维数组,并使用 java 中最后提供的二维数组
【发布时间】:2021-03-03 00:14:30
【问题描述】:

我有以下代码,其中每当我将一个新的二维数组传递给列表时,列表中现有的二维数组都会自动更新为刚刚传递给构造函数的二维数组。

private List <Timetable> timetablelist;
public TimetableManager() {
        
        this.timetablelist = new ArrayList<Timetable>(); 
         
    }
String[][] data = new String[6][10];
String tchridcls;
try{
BufferedReader br = new BufferedReader(new FileReader(file));
                    
                    Object[] lines = br.lines().toArray();
                    int i=0,j=0;
                    
                    while(i<lines.length){
                        String[] row = lines[i].toString().split(",",-1);
                        
                        tchridcls=row[0];
                        
                        data[j][0]=row[1];
                        
                        data[j][1]=row[2];
                        data[j][2]=row[3];
                        data[j][3]=row[4];
                        data[j][4]=row[5];
                        data[j][5]=row[6];
                        data[j][6]=row[7];
                        data[j][7]=row[8];
                        data[j][8]=row[9];
                        data[j][9]=row[10];
                        
                        i++;
                        j++;
                       
                        if(i%6==0){
                            
                            
                        Timetable t = new Timetable(data,tchridcls);
                        timetablelist.add(t);
                        j=0;
                        
                        }}}

这是课表课

public class Timetable {
    private String[][]  timetable = new String[6][10];
    private String teacherid_class;
    public Timetable(String[][] timetable, String teacherid_class){
        this.teacherid_class = teacherid_class;
        
        this.timetable = timetable;
        
    }
public String getteacherid_class(){
    return teacherid_class;
}

public String[][] gettimetable(){
    return timetable;}

我已经检查过将data[][] 传递给构造函数后出现的问题。由于某种原因,它使用新提供的 data[][] 2d 数组更新列表中所有现有对象的 data[][] 2d 数组。

这个问题花了很多时间请帮助我!!

【问题讨论】:

    标签: java arrays list


    【解决方案1】:
    public Timetable(String[][] timetable, String teacherid_class){
        this.teacherid_class = teacherid_class;
        this.timetable = timetable;    // all timetables reference the same object
    }
    

    使用您当前的代码,您只是创建了对相同二维数组(this=that) 的引用。当您更新data 时,所有引用都会更新,因为它们都是同一个对象。

    如下所示更改构造函数,以便创建二维数组的深拷贝。这将导致创建一个新对象、数据的深层克隆,而不仅仅是对它的 (mirror-copy) 引用。

    现在每个timetable 确实是一个新对象,并且data 的后续动作不会影响它们。

    public Timetable(String[][] tt, String tic)
    {
       this.teacherid_class = tic;
       this.timetable = Arrays.stream(tt).map(el -> el.clone()).toArray($ -> tt.clone());
     }
    

    我编辑名称只是为了便于阅读

    【讨论】:

    • 怎么了,阿兰?很棒的帖子。几年前我在教书的时候,不得不向我教书的作者传授深拷贝的概念;他拥有博士学位。可耻的是,他的最新版本从未给我任何荣誉。这就是为什么许多新开发者不理解这个概念的原因;写教科书的人不认识他们。
    • @hfontanez 很高兴听到你的消息!你在国外过得怎么样?根据我在旧大陆的经验,作为一个“不知何故”的新学生(8 年前完成了我的硕士学位),我不得不同意你所说的。我的一位老师说java的克隆总是很深,其他人只是评论了这个概念。结果:我们成为了没有被正确教导什么是浅拷贝和什么是深拷贝的工程师。就像没有正确教导医生静脉和动脉之间有什么区别一样。真伤心。正如你所说,这反映了
    • 关于新开发者在这方面的知识。指导方针简短明了,但不会传递给新工程师。原语、不可变的浅拷贝 --> OK ;否则需要深拷贝。多维数组也必须“深度复制”,因为它们只是一个变量列表,每个变量都引用一个一维数组;要么使用一些流命令,如此处所示,要么遍历外部数组并从那里克隆元素(实际上是内部数组)。
    • 这是一个更长的故事……更短的故事,他将保持无名,认为他的书示例是正确的。我向他提供了一个详细的例子,说明他为什么错了,并用几行解释了这个概念。他很自信。遗憾的是,当教科书发布信息时,大多数人倾向于将其视为福音(因为它们确实经过了“严格”​​的审查过程。无论如何,很高兴通过这些部分再次见到你!
    猜你喜欢
    • 2015-11-29
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    相关资源
    最近更新 更多