【问题标题】:Arrays Issue, not copying properly数组问题,无法正确复制
【发布时间】:2015-07-30 15:37:33
【问题描述】:

这是我正在使用的代码,用于从 csv 中获取行,将它们存储到名为 userDetails 的字符串数组中,然后,它将从此数据中获取 userDetails 的所有值,从第 4 个值开始(userDetails [3]),并将它们放入称为分数的二维整数数组中。

private void loadFromCSVFile() 
    {
        String path = "res/users.csv";
        BufferedReader br = null;
        String row = "";
        String DELIMETER = ",";
        int[][] scores = new int[3][9];
        try {

            br = new BufferedReader(new FileReader(path));
            while ((row = br.readLine()) != null) 
            {
                String[] userDetails = row.split(DELIMETER);

                int i = 3;
                for (int x = 0 ; x <= 2 ; x++)
                {
                    for (int y = 0 ; y <= 8 ; y++)
                    {
                        scores[x][y] = Integer.valueOf(userDetails[i] );
                        i++;
                    }
                } 

                user = new User( userDetails[0] , userDetails[1] , userDetails[2], scores);
                LoginChecker.Users.add(user);
            }


        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }

行:

user = new User( userDetails[0] , userDetails[1] , userDetails[2], scores);
LoginChecker.Users.add(user);

创建 User 类的一个新实例,并传入 3 个字符串(第一个 = 用户名,第二个 = 密码,第三个 = 用户类型(无论是教师、学生还是管理员)),连同 3 个字符串,它通过整数数组“分数”。

这段代码是为了以后在程序中我可以使用该代码:

for (int i = 0 ; i <= LoginChecker.Users.size() - 1 ; i++)
        {
            if (LoginChecker.Users.get(i).getUser().toLowerCase().equals(this.USERNAME))
            {
                System.out.println("Name: " + LoginChecker.Users.get(i).getUser().toLowerCase() + "  Score: " + LoginChecker.Users.get(i).getScores()[0][0] );
            }
        }

其中this.USERNAME是登录用户的字符串,理论上上面的代码应该得到该用户的数组的第一个分数(即[0][0]),并打印出来, 但它只显示 csv 中最后一个人的分数。

例如,如果 csv 包含:

人物1、密码、学生、1、2、3等

人物2、密码、学生、10、9、8等

无论你以谁的身份登录,它总是显示 10 作为第一个分数。

任何帮助都将不胜感激,对于长期阅读感到抱歉,如果您需要有关该程序的更多信息,请询问,我会定期合理地检查这一点,直到我找到解决方案。

非常感谢您。

【问题讨论】:

  • 告诉我们User。 (static)
  • 问题是您为所有用户使用相同的scores[][]。您应该在 while 循环中为每个用户创建一个新实例...
  • @brso05 我在附近。一旦 OP 用更多详细信息更新他们的问题,我会进行审查。
  • 我不确定,为什么你需要两个for循环,外部for循环有什么用for (int x = 0 ; x &lt;= 2 ; x++) ...根据我的理解,内部for循环负责读取9个分数值来自一名学生的 csv

标签: java arrays


【解决方案1】:

您为所有用户使用相同的scores[][]。您应该为每个用户创建一个 scores[][] 的新实例:

while ((row = br.readLine()) != null) 
{
    String[] userDetails = row.split(DELIMETER);
    int[][] scores = new int[3][9];************************************
    int i = 3;
    for (int x = 0 ; x <= 2 ; x++)
    {
        for (int y = 0 ; y <= 8 ; y++)
        {
            scores[x][y] = Integer.valueOf(userDetails[i] );
            i++;
        }
    } 

    user = new User( userDetails[0] , userDetails[1] , userDetails[2], scores);
    LoginChecker.Users.add(user);
}

【讨论】:

  • @JacobGroves scores[][] 你正在重用它,它对所有Users 都是一样的,这就是为什么它总是显示你最后一个User。您是否尝试过代码?
  • @JacobGroves 他们都指向同一个scores[][] 数组。
  • @JacobGroves 查看我发布的代码并尝试它是否有效。查看在while 循环中初始化scores[][] 所需的所有****************************** ...
  • 好的,谢谢,这已经成功了,但是你能解释一下为什么它不起作用,在我看来,这段代码应该使用相同的数组,但是每次它都会创建一个新用户,它有不同的内容?所以所有的用户都是用同一个数组做的,刚刚重写了,为什么不是这样
  • @JacobGroves 因为数组在某种意义上就像对象,而不是像原语那样被引用。当您创建一个新用户时,您是user = new User( userDetails[0] , userDetails[1] , userDetails[2], scores); 将对scores[][] 的引用传递给新对象。您所有的新对象都将指向内存中的同一个数组。您必须为每个用户对象创建一个新的instance,以便它们在内存中拥有自己的array。如果您更新一个Users score[][],那么您之前的操作方式将更新所有Users score[][]'s,因为它们都指向内存中的同一个数组...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多