簡體   English   中英

訪問 Arraylist of Objects 中的特定元素

[英]Accessing specific elements in Arraylist of Objects

真的很困惑如何僅訪問特定學生的年齡,其中學生的所有信息都存儲在文本文件中。 我正在閱讀文本文件並將該信息存儲到一個學生對象中,只需要訪問它的幫助。

public class Student {
    private String lName;
    private int idNumber;
    private int age;

    public Student() {
        lName = "";
        idNumber = 0;
        age = 0;
    }
    public Student(String l, int i, int a) {
        lName = l;
        idNumber = i;
        age = a;
    }

    public void setName(String last) {
        lName = last;
    }

    public String getName() {
        return lName;
    }

    public void setIdNum(int num) {
        idNumber = num;
    }

    public int getIdNum() {
        return idNumber;
    }

    public void setAge(int a) {
        age = a;
    }

    public int getAge() {
        return age;
    }
}

我的文本文件看起來像這樣: 此信息存儲在並行數組列表中。 我不太明白如何將它實現到一個對象中以將它傳遞給我的第二個承包商方法。

  Josh          2134         19
  Smith         5256         21
  Rogers        9248         19
  Andrew        7742         20

這是我嘗試過的;

public static void main(String[] args) {
    String file = "studentData.txt";
    Scanner reader = new Scanner(file);

    ArrayList<Student> users = readFile(file);
    Student s = new Student();
    users.add(s);


    Scanner input = new Scanner(System.in);
    //user enters idNumber to display age
    System.out.println("Enter ID Number"); //exception handling to be added
    int idNum = input.nextInt();

//this part is where I'm stuck 
    for(int i = 0; i < users.get(i) i++){
    if(idNum == users.get(i)){
     users.setAge(i);
}
}
     System.out.println(users.getAge());

}
//METHOD FOR READING FILE
 public static ArrayList<Student> readFile(String file)throws IOException{
    Scanner reader = new Scanner(new File(file));

    ArrayList<Student> list = new ArrayList<Student>();//creates ArrayList with student object

    reader.nextLine();//skips first line
    while(reader.hasNext()){//splits all text in the file into words
      String lName = reader.next();
      int idNum = reader.nextInt();
      int age = reader.nextInt();
      
    Student users = new Student(lName ,idNum, age); 
     list.add(users);
    }
    
   return list;

}//end method

我認為解決此問題的唯一方法是讀取文件 3 次以將名稱、idnum 和年齡存儲在單獨的數組列表中。 然后使用 ageList.get(i) 使用該單獨的數組列表來存儲年齡。 我相信那將是超級不必要的?

您可以像這樣將方法鏈接在一起。

      for(int i = 0; i < users.size(); i++){
         if(idNum == users.get(i).getIdNum()){
            final Student temp = users.get(i);
            System.out.println("Student with an ID of " + temp.getIdNum() + " has an age of " + temp.getAge());
         }
      }

在這里,我鏈接users.get(i)以獲取索引i處的Student ,然后調用getIdNum() ,它從我剛剛獲取的那個Student中獲取 ID。

然后,我執行==比較 --> 用戶輸入的 ID 是否與我正在查看的特定Student的 ID 相同?

如果結果為真,那么我再次調用users.get(i) ,它再次獲取同一個Student ,然后我將它存儲到一個名為temp的臨時Student變量中。 temp現在在通過 ID 檢查的ArrayList上引用該Student

然后,我使用temp並使用它具有的getIdNum()getAge()方法(因為tempStudent的一個實例,而Student具有這些方法),並使用它們創建一條消息,我打印到命令行.

這是一個完整的、可運行的示例。

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;

public class SOQ_20220514
{

   public static class Student {
      private String lName;
      private int idNumber;
      private int age;
   
      public Student() {
         lName = "";
         idNumber = 0;
         age = 0;
      }
      public Student(String l, int i, int a) {
         lName = l;
         idNumber = i;
         age = a;
      }
   
      public void setName(String last) {
         lName = last;
      }
   
      public String getName() {
         return lName;
      }
   
      public void setIdNum(int num) {
         idNumber = num;
      }
   
      public int getIdNum() {
         return idNumber;
      }
   
      public void setAge(int a) {
         age = a;
      }
   
      public int getAge() {
         return age;
      }
   }

   public static void main(String[] args) throws IOException {
      String file = "studentData.txt";
      Scanner reader = new Scanner(file);
   
      ArrayList<Student> users = readFile(file);
      Student s = new Student();
      users.add(s);
   
   
      Scanner input = new Scanner(System.in);
    //user enters idNumber to display age
      System.out.println("Enter ID Number"); //exception handling to be added
      int idNum = input.nextInt();
   
   //this part is where I'm stuck 
      for(int i = 0; i < users.size(); i++){
         if(idNum == users.get(i).getIdNum()){
            final Student temp = users.get(i);
            System.out.println("Student with an ID of " + temp.getIdNum() + " has an age of " + temp.getAge());
         }
      }
   
   }
//METHOD FOR READING FILE
   public static ArrayList<Student> readFile(String file)throws IOException{
      Scanner reader = new Scanner(new File(file));
   
      ArrayList<Student> list = new ArrayList<Student>();//creates ArrayList with student object
   
      reader.nextLine();//skips first line
      while(reader.hasNext()){//splits all text in the file into words
         String lName = reader.next();
         int idNum = reader.nextInt();
         int age = reader.nextInt();
      
         Student users = new Student(lName ,idNum, age); 
         list.add(users);
      }
    
      return list;
   
   }//end method

}

davidalayachew 的答案看起來是正確的。 為了好玩,這里有一個替代方案。

提供輸入數據。 我將模擬一個帶有String作為文本輸入的文件。

String input =
        """
        Josh,2134,19
        Smith,5256,21
        Rogers,9248,19
        Andrew,7742,20     
        """;

定義一個Student類來保存數據。 如果此類的主要目的是透明且不可變地傳遞數據,請使用記錄 編譯器隱式創建構造函數、getter、 equals & hashCodetoString

record Student( String name , int id , int age ) { }

請注意,我們可以在方法中本地聲明一條record 或者聲明嵌套在另一個類中,或者單獨聲明。

接下來,我們使用流在單個語句中完成大量工作。

首先,我們在輸入文本中創建每一行的流。 通過調用String#lines ,我們得到一個Stream< String > ,一系列String類型的元素。

對於這些行中的每一行,我們調用Stream#map來創建另一個流。 我們用逗號分隔每一行以獲得一個字符串數組, String[] 每個數組有三個元素,每行包含三個信息。

對於線部分的每個字符串數組,我們再次調用Stream#map以創建另一個流。 這第三個流將是Student對象的流。 我們通過獲取行的三個部分來生成每個Student對象,將第 2 和第 3 部分解析為int值,並將所有 3 部分輸入到Student記錄的構造函數中。 結果是一個Student ,一個接一個的學生對象,形成第三個流。

最后,我們將第三個流產生的Student對象收集到一個列表中。

List < Student > students =
        input
                .lines()                            // First stream, of `String` objects, one for each line in our source text.
                .map( line -> line.split( "," ) )   // Second stream, of `String[]` objects. 
                .map( lineParts ->                  // Third stream, of `Student` objects produced by the three parts of each line of input text.
                        new Student(
                                lineParts[ 0 ] ,
                                Integer.parseInt( lineParts[ 1 ] ) ,
                                Integer.parseInt( lineParts[ 2 ]
                                )
                        )
                )
                .toList();

你的目標是改變每個學生的年齡。 要使用不可變對象(記錄)做到這一點,我們可以定義一個方法,該方法根據原始值返回一個新對象。 所以我們添加了一個withAge方法。 我們with java.time類建立的命名約定使用這個詞。

record Student( String name , int id , int age )
{
    Student withAge ( int age ) { return new Student( this.name , this.id , age ); }
}

制作您修改后的年齡。

List < Student > results = new ArrayList <>( students.size() );
for ( int i = 0 ; i < students.size() ; i++ )
{
    Student student = students.get( i );
    results.add( student.withAge( i ) );
}

這是整個示例類,為了您的復制粘貼方便。

package work.basil.example.text;

import java.util.ArrayList;
import java.util.List;

public class App
{
    public static void main ( String[] args )
    {
        App app = new App();
        app.demo();
    }

    private void demo ( )
    {
        String input =
                """
                Josh,2134,19
                Smith,5256,21
                Rogers,9248,19
                Andrew,7742,20     
                """;

        record Student( String name , int id , int age )
        {
            Student withAge ( int age ) { return new Student( this.name , this.id , age ); }
        }

        List < Student > students =
                input
                        .lines()
                        .map( line -> line.split( "," ) )
                        .map( lineParts ->
                                new Student(
                                        lineParts[ 0 ] ,
                                        Integer.parseInt( lineParts[ 1 ] ) ,
                                        Integer.parseInt( lineParts[ 2 ]
                                        )
                                )
                        )
                        .toList();

        List < Student > results = new ArrayList <>( students.size() );
        for ( int i = 0 ; i < students.size() ; i++ )
        {
            Student student = students.get( i );
            results.add( student.withAge( i ) );
        }

        System.out.println( "students = " + students );
        System.out.println( "results = " + results );
    }
}

跑的時候。

學生= [學生[姓名=喬希,id=2134,年齡=19],學生[姓名=史密斯,ID=5256,年齡=21],學生[姓名=羅傑斯,ID=9248,年齡=19],學生[ name=Andrew, id=7742, age=20]] 結果 = [Student[name=Josh, id=2134, age=0], Student[name=Smith, id=5256, age=1], Student[name=羅傑斯,id=9248,age=2],學生[name=Andrew,id=7742,age=3]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM