[英]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()
方法(因為temp
是Student
的一個實例,而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
& hashCode
和toString
。
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.