真的很困惑如何僅訪問特定學生的年齡,其中學生的所有資訊都存盤在文本檔案中。我正在閱讀文本檔案并將該資訊存盤到一個學生物件中,只需要訪問它的幫助。
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) 使用該單獨的陣列串列來存盤年齡。我相信那將是超級不必要的?
uj5u.com熱心網友回復:
您可以像這樣將方法鏈接在一起。
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)以獲取Studentat index i,然后呼叫getIdNum(),它從Student我剛剛獲取的 ID 中獲取 ID。
然后,我進行==比較 --> 用戶輸入的 ID 是否與Student我正在查看的特定 ID 相同?
如果結果為真,那么我users.get(i)再次呼叫,它再次獲取相同的結果,然后Student將其存盤到一個Student名為temp. temp現在在通過 ID 檢查Student的那個上參考它。ArrayList
然后,我使用temp, 并使用它具有的getIdNum()andgetAge()方法(因為它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
}
uj5u.com熱心網友回復:
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在方法中本地宣告 a。或者宣告嵌套在另一個類中,或者單獨宣告。
接下來,我們使用流在單個陳述句中完成大量作業。
首先,我們在輸入文本中創建每一行的流。通過呼叫String#lines,我們得到一個Stream< String >,一系列型別的元素String。
對于這些行中的每一行,我們呼叫Stream#map以創建另一個流。我們用逗號分隔每一行,得到一個字串陣列,String[]. 每個陣列有三個元素,每行包含三個資訊。
對于行部分的每個字串陣列,我們Stream#map再次呼叫以創建另一個流。這第三個流將是一個Student物件流。Student我們通過獲取該行的三個部分來生成每個物件,將第二個和第三個部分決議為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]]
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/474725.html
上一篇:AWSLambdajava.lang.ClassNotFoundException:com.opencsv.exceptions.CsvException
