【问题标题】:How can I return a specific object (index) from an arraylist in Java?如何从 Java 中的数组列表返回特定对象(索引)?
【发布时间】:2013-02-23 14:19:59
【问题描述】:

我创建了一个名为 Student 的类并为其分配了 3 个值(StudentNumber、Course、Mark);然后我将一个创建的学生分配给一个名为 studentsCourses 的数组列表。

这样每个学生都会在数组中占用一个索引。但是我怎样才能让学生从 arrayList 中退出……如果这有意义的话?我已将它们存储起来,但我不知道如何调用这些信息以便我可以看到它。

public static void main (String[]args){
ArrayList<Student> studentsCourses= new ArrayList<Student>();
String studentNumber="~";
String course="~";
int mark=0;

Student pat;

Student s=null;

do{
  s=new Student();
  System.out.println("Please Enter Your Student ID (type quit to Quit):\n");
  studentNumber=keybrd.next();
  s.setStudentNumber(studentNumber);
  System.out.println("Please Enter Your Course ID:\n");
  course=keybrd.next();
  s.setCourse(course);
  System.out.println("Please Enter Your Mark:\n");
  mark=keybrd.nextInt();
  s.setMark(mark);
  s.printStates();
  studentsCourses.add(s);
}while(!studentNumber.equals("quit"));

System.out.println(studentsCourses.size());   
System.out.println(studentsCourses);

所以如果我想为创建的学生 (pat) 分配索引 1 的状态,我该怎么做?

我的另一个问题(伴随这段代码)是我的哨兵。当我输入退出时它确实退出了。但它首先完成了“做”。这意味着我实际上最终得到了一个学生,他的号码是“退出”课程是什么,分数是什么。

一旦输入“退出”,我如何强制它中断执行?

【问题讨论】:

  • 你到底想做什么?
  • 我实际上推迟了将近一个小时才发布这篇文章,因为我想我会找到简单的解决方案,但我没有;现在(发布后 5 分钟)我想通了。这简直太简单了 pat=studentsCourses.get(index);
  • 如果有人能帮我解决这个问题,我仍然需要修复哨兵部分?
  • @Anubhab 我希望程序反复询问用户他们的学号、课程名称和该课程的标记,直到输入退出。当输入退出时,我希望它停止提示并移至代码的下一部分。
  • 我的问题被否决的任何原因?

标签: java class object arraylist sentinel


【解决方案1】:

“但是我如何让学生从 arrayList 中退出......如果这有意义的话?我已经将它们存储起来,但我不知道如何调用这些信息以便我可以看到它。”

从arraylist中获取数据:

for (Student student : studentsCourses) {
        System.out.println(student.getStudentNumber());
        System.out.println(student.getCourse());
        System.out.println(student.getMarkr());
    }

for (int i = 0; i < studentsCourses.size(); i++) {
        Student student = studentsCourses.get(i);
        System.out.println(student.getStudentNumber());
        System.out.println(student.getCourse());
        System.out.println(student.getMarkr());
    }

要解决其他问题,你可以试试:

      do{
          s=new Student();
          System.out.println("Please Enter Your Student ID (type quit to Quit):\n");
          studentNumber=keybrd.next();
          if(studentNumber.equals("quit"))
              break;
          s.setStudentNumber(studentNumber);
          System.out.println("Please Enter Your Course ID:\n");
          course=keybrd.next();
          s.setCourse(course);
          System.out.println("Please Enter Your Mark:\n");
          mark=keybrd.nextInt();
          s.setMark(mark);
          s.printStates();
          studentsCourses.add(s);
        }while(true);

【讨论】:

  • 你先生,是个聪明人 :) 非常感谢你插入 if 语句工作得很好。我没有意识到你可以把 "}while(true)" 这句话到底是什么意思?虽然什么是真的?
  • @Anubhab 非常;这不是很明显:)
  • @vishal_aim:您提到的访问列表的方式很好,但是当列表有 1000 个左右的条目时,它会降低性能。在这种情况下,我猜如果您在记录中有任何唯一标识符,例如:id,no,则使用 hashmap 会有所帮助。等等。
  • @Anubhab 取决于,如果最后我们只需要显示所有结果,列表更好(顺序访问),如果我们需要查找任何元素(通过唯一 ID 的学生),那么当然hashmap 更好
  • @Vishal_aim:是的,这是正确的。如果你想要一份报告,那么这是最好的。 :)
【解决方案2】:

ArrayList 不是一个数组...它是一个使用数组作为其后备存储的 List。

从列表中检索方法是list.get(index)

或者,您可以使用一些语法糖来循环它们

List<Student> students = new ArrayList<Student>();
// add students
for (Student student : students) {
  // do something with student
}

【讨论】:

    【解决方案3】:

    使用get(int)方法检索元素。

    使用add(int, E)方法在索引处插入元素。

    【讨论】:

      【解决方案4】:

      试试

      System.out.println("Please Enter Your Student ID (type quit to Quit):\n");
              studentNumber=keybrd.next();
      
              while (!studentNumber.equals("quit")){
                  s=new Student();
      
                  s.setStudentNumber(studentNumber);
                  System.out.println("Please Enter Your Course ID:\n");
                  course=keybrd.next();
                  s.setCourse(course);
                  System.out.println("Please Enter Your Mark:\n");
                  mark=keybrd.nextInt();
                  s.setMark(mark);
                  s.printStates();
                  studentsCourses.add(s);
      
                  System.out.println("Please Enter Your Student ID (type quit to Quit):\n");
                  studentNumber=keybrd.next();
              }
      

      【讨论】:

      • 这是一个栅栏循环,对吗?我确实在没有 do 语句的情况下尝试过,但不是作为栅栏循环......我会试一试;谢谢
      【解决方案5】:

      您可以将toString() 方法添加到您的学生类:

        @Override
        public String toString()
        {
            return "\tStudentNumber: " + studentNumber
                      + "\tCourse: " + course 
                      + "\tMarks: " + marks;
      
        }
      

      然后你可以说:

         System.out.println(studentsCourses);
      

      就此而言:

         How do I force it to break the do as soon as "quit" is typed?
      

      这种行为是因为您使用的是 do..while() !尝试改用while

      【讨论】:

      • 我确实在最初使用过,它给了我同样的问题; do..while 是我尝试解决的方法:) 谢谢!目前只使用“list.get(index)”似乎就足够了,但我会记住 toString
      【解决方案6】:

      有两件事你需要知道:-

      首先,您正在使用do-while 循环,这是一个退出检查 循环,因此它会在终止之前至少执行一次。如果您想避免它,请尝试使用while 循环。

      接下来,要从列表中检索所有元素,您可以使用list.get(index)for 循环遍历,如下所示:-

      List<Student> students = new ArrayList<Student>();
      for (Student student : students) {
          // Do something with the student object.
      }
      

      更新:-

      您在上面看到的for 实际上是Foreach 循环。就是这个意思

      for each item in collection:
        do something to item
      

      因此,循环意味着,

      对于collection(students)中的每个item(student)
      item(student)

      做点什么

      现在回到循环部分。忘记一切,只需使用break;

      在这段代码studentNumber=keybrd.next();之后,进行检查并中断循环。

      if(studentNumber.equals("quit")){
          break;
      }
      

      简单的解决方案。

      【讨论】:

      • 我是否缺少“while”循环的内容?因为现在有 3 个人建议了一个 while 循环,但那是我开始的……它给了我同样的问题,而 do..while 是一个尝试的解决方案。另外,如果您不介意,您可以扩展 for (Student student : students){ 我真的不明白它在做什么?第一个“学生”是班级;第二个是名字?在冒号之后?
      • @OscarWilde - 检查我的更新,只是想知道 Foreach 会发生什么。
      • 感谢您将其布置得如此简单!完全有道理;我最终选择了 if..break 选项;干杯!
      【解决方案7】:

      为什么不使用带有键作为学生编号和对象的哈希图作为学生对象。这样,您也可以避免重复。
      为了哨兵

               // 1. Create a Scanner using the InputStream available.
              Scanner scanner = new Scanner( System.in );
              String input=null;
      do{
              // 2. Don't forget to prompt the user
              System.out.print( "Type some data for the program: " );
      
              // 3. Use the Scanner to read a line of text from the user.
               input = scanner.nextLine();
      
              // 4. Now, you can do anything with the input string that you need to.
              // Like, output it to the user.
              System.out.println( "input = " + input );
      }while(!input.equalsIgnoreCase("quit"));
      

      【讨论】:

        猜你喜欢
        • 2021-04-06
        • 2021-08-15
        • 1970-01-01
        • 2018-12-11
        • 1970-01-01
        • 2022-01-01
        • 1970-01-01
        • 2013-10-15
        • 1970-01-01
        相关资源
        最近更新 更多