当前位置: 首页 > 知识库问答 >
问题:

访问由字符串和数组组成的对象中的数组

白青青
2023-03-14

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

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

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

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中对象中的数组)

在所有(未知数量)用户输入信息后,按下一个按钮,表示没有更多用户输入信息。此时,我需要访问每个person对象的name和choices数组,要做到这一点,我显然会使用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;当票据输入2,1,4,3,6,5时,将显示以下内容:

鲍勃2114365

汤姆2 1 4 3 6 5

条例草案2 1 4 3 6 5

显然这是不对的。但我不明白为什么它会正确地显示每个名字,但它只显示每个人最近输入的选择。这就好像Person类中的getName()方法返回每个对象的相应名称,但是getChoices()方法返回每个对象的最新选择数组,而不是相应的选择数组。有人能帮忙吗?如果我需要澄清什么,请告诉我。提前谢谢!

共有2个答案

程吕恭
2023-03-14

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

堵茂勋
2023-03-14

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

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

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

希望这能有所帮助。

 类似资料:
  • 问题内容: 在执行过程中,您将json解组为结构。问题是我有一个api,可能会在请求之间更改键值的类型。 例如,可能是内联对象的对象如下: 而且还可以通过键指向对象,如下所示: 可以内联某些对象,但是可以从多个位置引用其他对象。 在javascript或python中这不是问题。只需检查类型。 解组和解析这两个对象的惯用方式是什么?是反映的唯一方法吗? 问题答案: 您可以将此JSON解组为如下结构

  • 尝试使用所有独特的硬币进行选择过滤器,但无法正确到达其末尾。 在循环浏览数据时,我可以得到所有硬币的列表。 我还想使用Set方法和spread操作符来获得唯一的值,但我不知道如何组合所有这些。

  • 我有一个对象只包括一个数组(17)。我想从这个数组中得到特定的值,例如 时,我得到: 最后,在调用this.flights['states'][0][4]时,我收到一个错误: 正在启动我从Opensky网络Api获取的flights对象:

  • 上面的代码在我的主方法中。被注释掉的行抛出错误“无法在类车辆中找到符号”。我正在从一个文件中读取并将信息放置到正确的对象数据字段中。数组是车辆数组。根据我的理解,车辆数组的一个元素可以是车辆或车辆的任何子类。Getters和setters方法可用于每个相应的类和子类,使用父类的Getters和setters。汽车是车辆的一个子类。当我刚刚创建car对象时,为什么不在尝试vehicle之前先尝试访问

  • 为什么我会得到异常,我如何访问某些字符串中的某些字符位置?

  • 我使用以下代码将对象数组转换为字符串数组: 但我想知道是否有另一种方法可以做到这一点,比如: 但这将导致运行时错误:<code>线程“AWT-EventQueue-0”java.lang.ClassCastException中的异常:[Ljava.langs.Object;无法强制转换为[Ljava.lang.String; 正确的做法是什么?