【问题标题】:How to retain an object in an array of objects in Java如何在Java中的对象数组中保留一个对象
【发布时间】:2018-10-25 04:27:08
【问题描述】:

我不知道如何问这个问题。我必须编写一个具有 2 个类的程序:一个存储数据,一个调用显示数据。数据是学生的姓名和他/她的4门课程的名称。但我必须把它放在一个循环中,让用户输入至少 3 条记录。如果用户没有输入学生的姓名(或姓名 = 空白),则退出循环并显示输入的信息。

例子:

John Doe MATH 101 ENGL 101 READ 101 COMP 101
Jane Doe PHYS 101 CHEM 101 PSYC 101 ACCT 101
Mary Doe PHED 101 HIST 101 CALC 101 POLS 101

我要做的是让每个学生记录一个对象并将这 3 个对象存储在一个对象数组中然后显示它。

下面是我的代码:

import java.util.Scanner;
public class UserInterface {
    public static void main(String[] args) {
    //Create a scanner
    Scanner input = new Scanner(System.in);

    //Create an object from Business class
    Business b = new Business();

    //Declare variables
    final int NUMBER_OF_COURSES = 4;
    String[] coursesName = new String[4];
    Business[] businessArray = new Business[3]; //Declare a array of objects

    for (int counter = 0; counter < businessArray.length; counter++) {

    //Prompt user to input name
    System.out.println("Enter student's name: ");
    b.setName(input.nextLine());

    for (int i = 0; i < NUMBER_OF_COURSES; i++) {
    System.out.println("Enter " + b.getName() + "'s course number " + (i + 1));
    coursesName[i] = input.nextLine();
    }//end of for(i)-loop

    b.setCourses(coursesName);

    businessArray[counter] = b;

    System.out.println(businessArray[counter]); //Here it display correctly for each round

    }//End of for(counter)-loop

    for (int pa = 0; pa < businessArray.length; pa++)
        System.out.println(businessArray[pa]);         //but here it displays 3 records of the last entry
                                                        //so my question is how do I retain each entry in its own object and 
                                                     //adds it to the array of objects? 
                                                     //I know that b gets overwrite by the last data entered because
                                                    //it is just a pointer to that object.  

    input.close();

    }//End of main method

}//End of class UserInterface


The other class:

public class Business {

    //Declare variables
    private String name;
    private String[] courses = new String[4];

    //Default Constructor
    public Business(){

    }

    //getter for student's name
    public String getName() {
        return name;
    }

    //setter for student's name
    public void setName(String name) {
        this.name = name;
    }

    //getter for courses' name
    public String[] getCourses() {
        return courses;
    }

    //setter for courses' name
    public void setCourses(String[] courses) {
        this.courses = courses;
    }

}//End of class Business

我知道我的代码不好。但是我需要为这个 Business 类中的每个变量设置 getter 和 setter。

【问题讨论】:

  • 您好 DCN,欢迎来到 Stack Overflow。社区并没有“真正刻薄”,而是试图保持 SO 的质量。您已经注意到您不了解规则,因此请通过tour 熟悉 SO 的工作原理。特别是回顾how to ask a question 以及如何留下on topic。如果您遵循指南,那么您的问题将不会被否决或关闭。
  • 谢谢戴夫!我会检查一下。我总是花很多时间搜索,在发布内容之前搜索我的答案。但有时我无法想出正确的术语来找到我正在寻找的正确答案。

标签: java arrays class object


【解决方案1】:

将您创建的 Business 对象移动到 for 循环中:

for (int counter = 0; counter < businessArray.length; counter++) {
    Business b = new Business();
    // ...
}

现在,数组中的每个条目都指向同一个对象,因此您正在重复覆盖其中的值。将创建移动到循环中意味着您将为数组的每个插槽拥有不同的对象。

【讨论】:

  • 感谢迈克帮助我。我把它移到了循环中,它起作用了。一个简单的举动,如果不是因为你的提示,我永远不会弄清楚。但是现在数组无法正确显示。它显示 ASCII 值。
  • 嗨迈克!你能帮我如何显示这个对象数组吗?在将实例移动到 for 循环中之前,它显示得很好。现在我做了你展示的,我可以让它展示更多。我尝试了许多不同的 Arrays.toString() 方法......无论我是在循环内部还是外部打印,都只是打印出数组的十六进制值。请帮忙。谢谢!
  • 移动它应该对此没有任何影响。如果您将线路切换回去并且不进行其他任何更改,它是否会再次成功开始打印?这可能需要一个新问题。
  • 我必须调用它的方法才能正确打印数组的内容:businessArray[x].getName() + businessArray[x].getCourses() 再次感谢!当我解决一个问题时,我遇到了不同的问题。这是学习的一部分。但感谢您和社区在此过程中提供的帮助。
【解决方案2】:
String retainCourse(int pointer){
    return this.courses[pointer];
}

将此功能添加到您的业务类。

您应该覆盖该类的.toString() 方法以获得预期的结果。

在 for 循环中,更好的做法是获取当前对象并将其设置为强制转换为确切类的临时变量! Business current = (Business) businesses[i];

【讨论】:

  • 感谢 Abel 抽出时间帮助我。我必须阅读更多关于你在这里展示的一些内容。我的水平还没有到。你可以投射一个物体!哇。但我需要弄清楚创建这个 .toString() 以正确打印我的数组。我使用了 java.until.Arrays.toString(businessArray[counter]) 但它在 .toString 处给了我一个编译错误。
猜你喜欢
  • 2021-09-09
  • 1970-01-01
  • 1970-01-01
  • 2015-10-08
  • 1970-01-01
  • 2014-04-11
  • 1970-01-01
  • 2020-01-23
  • 2021-06-07
相关资源
最近更新 更多