【问题标题】:Accessing an array within an Object that consists of a string and the array访问由字符串和数组组成的对象中的数组
【发布时间】:2015-06-01 05:21:27
【问题描述】:

我的程序有一个对象类Person。一个 Person 对象由一个字符串 name(这是一个人的名字)和一个 6 元素字符串数组 choices 组成。该数组保存用户输入的值,以对 6 种不同的运动进行排名,从最喜欢到最不喜欢。

例如,一个名为testPerson 的Person 对象可以由一个设置为"Bob" 的字符串和一个包含每个元素的数组组成,如下所示{3,1,4,2,5,6}。 (列出的第二项运动是 Bob 最喜欢的运动,最后列出的运动是他最不喜欢的运动)。

可以使用以下代码创建该示例对象:

String[] tempArray = new String[]{"3","1","4","2","5","6"};
Person newPerson = Person("Bob",tempArray);

这是 Person 类:

public class Person{
    private String[] choices = new String[6];
    private String name;
    //constructor
    public Person(String myName, String[] myInput){
        choices = myInput;
        name = myName;
    }
    //returns the choices array
    public String[] getChoices(){
        return(choices);
    }
    //returns the name
    public String getName(){
        return(name);
    }
}

每次新用户输入他们的姓名和选择时,我都会创建一个新对象。因为我不知道新用户会输入多少次他们的详细信息,所以我将每个新对象存储在一个名为“people”的 ArrayList 中。 (是的,我知道...... ArrayList 中的对象中的数组)

在所有(未知数量的)用户都输入了他们的信息后,按下一个按钮,表示没有更多用户可以输入信息。此时我需要访问每个人对象的名称和选择数组 为此,我显然会使用 for each 循环。我是这样设置的:

String[] myChoices = new String[6];
String myName;
for(Person getPerson: people){
    myChoices = getPerson.getChoices();
    myName = getPerson.getName();
    //print name and choices
    System.out.println(myName);
    for(int i = 0; i < 6; i ++){
        System.out.println(myChoices[i]);
    }
}

“for each”循环应该打印名称和 6 元素数组的每个元素,它会为添加到人员 ArrayList 的每个对象执行此操作。换句话说,如果 10 个人输入他们的姓名和他们的选择,它会按照他们输入的顺序打印每个人的姓名和他们的选择。

但是,当我运行代码时,它会显示每个不同的名称,但在每个名称下它会显示仅属于最后一个输入他们选择的人的选择。 例如,如果 Bob 输入 3,2,1,6,5,4 ;汤姆输入 1,3,5,2,4,6;而Bill输入2,1,4,3,6,5,会显示如下:

鲍勃 2 1 4 3 6 5

汤姆 2 1 4 3 6 5

比尔 2 1 4 3 6 5

显然这是不对的。但我不明白为什么它正确显示每个名字,但它只显示每个人最近输入的选择。就好像 Person 类中的 getName() 方法返回每个对象的相应名称,但 getChoices() 方法返回最近的选择数组,而不是每个对象各自的选择数组。有人可以帮忙吗?让我知道是否需要澄清任何事情。提前致谢!

【问题讨论】:

  • 您没有展示如何创建所有 Person 对象(期望第一个对象)。我怀疑您对所有这些都使用相同的选择数组。

标签: java arrays oop object arraylist


【解决方案1】:

在您的构造函数中使用以下代码。

 //constructor
    public Person(String myName, String[] myInput){
        String copy = new String[6];
        System.arraycopy(myInput, 0, copy, 0, myInput.length);
        choices = copy;
        name = myName;
    }

这一切都是由于您的对象引用而发生的。基本上,您使用相同的数组 object 来初始化所有对象,这意味着如果 原始 对象发生更改,则所有 Person 对象中的数组对象都会更改。在上面的代码中,您正在制作该数组的新副本,然后将该 new 数组存储在您的 Person 对象中。

希望这会有所帮助。

【讨论】:

  • 完美运行!你有没有机会向这个 java noob 解释一下为什么会这样?
  • 啊,有道理!谢谢你的帮助! :)
【解决方案2】:

这很可能是一个赋值问题,您对所有人使用相同的数组,因此该数组反映了最后输入的值。要么为每个条目创建一个新数组,要么在构造过程中将数组复制到对象中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-06
    • 1970-01-01
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    • 2019-09-18
    相关资源
    最近更新 更多