Verwenden Sie ein Array oder eine ArrayList eines Objekts, damit alle Datensätze aus der Datei im Speicher gespeichert werden können [geschlossen]
Ich bin ein Java-Anfänger und habe Probleme mit meinen Übungen.
Dies ist meine Client.txt-Datei:
1,Jay, Walker,91 Boland Drive,BAGOTVILLE,NSW,2477
2,Mel, Lowe,45 Ocean Drive,MILLERS POINT,NSW,2000
3,Hugh, Manatee,32 Edgecliff Road,REDFERN,NSW,2016
4,Elizabeth, Turner,93 Webb Road,MOUNT HUTTON,NSW,2290
Dies ist meine Client-Klasse (habe Konstruktor):
public class Client {
private int clientID;
private String firstName;
private String surName;
private String street;
private String suburb;
private String state;
private int postcode;
// constructor
public Client (int ID, String fName, String sName, String str, String sb, String sta, int pCode) {
clientID = ID;
firstName = fName;
surName = sName;
street = str;
suburb = sb;
state = sta;
postcode = pCode;
}
Dies ist mein Code, der ein Objekt erstellt und die Datensätze liest, die aus der txt-Datei gelesen werden:
File inFile = new File("clients.txt");
Scanner inputFile = new Scanner(inFile);
String str;
String[] tokens;
while (inputFile.hasNext()) {
str = inputFile.nextLine(); // read a line of text from the file
tokens = str.split(","); // split the line using commas as delimiter
// map each token that is already printed to corresponding field in Client class
// Because tokens[0] is of type String but clientID is of type int,
// we need to parse it and get the integer representation.
// we also do the same thing with postcode
int clientID = Integer.parseInt(tokens[0]);
String firstName = tokens[1];
String surName = tokens[2];
String street = tokens[3];
String suburb = tokens[4];
String state = tokens[5];
int postcode = Integer.parseInt(tokens[6]);
// create a new object of `Client` type
// and pass all the gathered information.
Client client = new Client(clientID, firstName, surName, street, suburb, state, postcode);
System.out.println(client + "\n");
} // end while
Die Anforderung der Übung besteht nun darin, dass ich das Programm so ändern muss, dass ein Array oder eine ArrayList dieses Client-Objekts verwendet wird, damit alle Client-Datensätze aus der Datei problemlos im Speicher gespeichert werden können und jedes Objekt aus dem Dateispeicherort erstellt wird es in das Array / ArrayList von Client-Objekten
Ich habe gerade erst einige Wochen angefangen, Array und ArrayList zu studieren, daher habe ich keine Ahnung, wie ich diese Übungen machen soll. Kann mir jemand helfen?
Antworten
whileErstellen Sie vor Ihrer Schleife eineArrayList
ArrayList<Client> cList = new ArrayList<> ();
In Ihrer Schleife,
Client client = new Client(clientID, firstName, surName, street, suburb, state, postcode);
// add to list
cList.add (client);
Über der while-Schleife können Sie einfach eine neue Liste erstellen
List<Client> clientList = new ArrayList<>();
und dann zur Client-Liste hinzufügen, nachdem Sie jede erstellt haben new Client(..)
mit clientList.add(client)
Sie können den Konstruktor von überschreiben, Clientsodass er auch nur eine Zeile aus der Datei aufnehmen kann:
import java.util.stream.Stream;
public class Client {
private int clientId;
private String firstName;
private String lastName;
private String street;
private String suburb;
private String state;
private int postcode;
public Client(int clientId, String firstName, String lastName, String street, String suburb, String state,
int postcode) {
this.clientId = clientId;
this.firstName = firstName;
this.lastName = lastName;
this.street = street;
this.suburb = suburb;
this.state = state;
this.postcode = postcode;
}
public Client(String line) {
String[] split = line.split(",");
this.clientId = Integer.parseInt(split[0]);
this.firstName = split[1];
this.lastName = split[2].trim();
this.street = split[3];
this.suburb = titleCase(split[4]);
this.state = split[5];
this.postcode = Integer.parseInt(split[6]);
}
@Override
public String toString() {
return String.format("%s %s - %s, %s - %s, %d", this.firstName, this.lastName, this.street, this.suburb,
this.state, this.postcode);
}
private String titleCase(String suburb) {
return Stream.of(suburb.split(" ")).map(w -> w.toUpperCase().charAt(0) + w.toLowerCase().substring(1))
.reduce((s, s2) -> s + " " + s2).orElse("");
}
}
Verwenden Sie auch Try-with-Resources für Ihren Scanner :
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
class Main {
public static void main(String[] args) {
List<Client> clientList = new ArrayList<>();
try (Scanner scanner = new Scanner(new File("Clients.txt"))) {
while (scanner.hasNext()) {
String line = scanner.nextLine();
clientList.add(new Client(line));
}
} catch (IOException e) {
e.printStackTrace();
}
for (Client client : clientList) {
System.out.println(client);
}
}
}
Ausgabe:
Jay Walker - 91 Boland Drive, Bagotville - NSW, 2477
Mel Lowe - 45 Ocean Drive, Millers Point - NSW, 2000
Hugh Manatee - 32 Edgecliff Road, Redfern - NSW, 2016
Elizabeth Turner - 93 Webb Road, Mount Hutton - NSW, 2290
Probieren Sie es hier aus .