Part 4

Objekte in einer Liste

Der bei der Erstellung einer Liste verwendete Typparameter definiert den Typ der Variablen, die der Liste hinzugefügt werden. Beispielsweise enthält ArrayList<String> Zeichenketten, ArrayList<Integer> Ganzzahlen und ArrayList<Double> Gleitkommazahlen.

Im folgenden Beispiel fügen wir zuerst Zeichenketten zu einer Liste hinzu und geben anschließend die Zeichenketten in der Liste nacheinander aus.

ArrayList<String> names = new ArrayList<>();

// eine Zeichenkette kann zuerst in einer Variablen gespeichert werden
String name = "Betty Jennings";
// dann wird sie der Liste hinzugefügt
names.add(name);

// Zeichenketten können auch direkt zur Liste hinzugefügt werden:
names.add("Betty Snyder");
names.add("Frances Spence");
names.add("Kay McNulty");
names.add("Marlyn Wescoff");
names.add("Ruth Lichterman");

// verschiedene Schleifenarten können verwendet werden, 
// um die Listenelemente zu durchlaufen

// 1. while-Schleife
int index = 0;
while (index < names.size()) {
    System.out.println(names.get(index));
    index = index + 1;
}

System.out.println();
// 2. for-Schleife mit Index
for (int i = 0; i < names.size(); i++) {
    System.out.println(names.get(i));
}

System.out.println();
// 3. for-each-Schleife (kein Index)
for (String name: names) {
    System.out.println(name);
}
Beispielausgabe

Betty Jennings Betty Snyder Frances Spence Kay McNulty Marlyn Wescoff Ruth Lichterman

Betty Jennings Betty Snyder Frances Spence Kay McNulty Marlyn Wescoff Ruth Lichterman

Betty Jennings Betty Snyder Frances Spence Kay McNulty Marlyn Wescoff Ruth Lichterman

Hinzufügen von Objekten zu einer Liste

Zeichenketten sind Objekte, daher ist es keine Überraschung, dass auch andere Arten von Objekten in Listen enthalten sein können. Als nächstes werden wir uns die Zusammenarbeit von Listen und Objekten genauer ansehen.

Angenommen, wir haben Zugriff auf die unten definierte Klasse, die eine Person beschreibt.

public class Person {

    private String name;
    private int age;
    private int weight;
    private int height;

    public Person(String name) {
        this.name = name;
        this.age = 0;
        this.weight = 0;
        this.height = 0;
    }

    public String getName() {
        return this.name;
    }

    public int getAge() {
        return this.age;
    }

    public void growOlder() {
        this.age = this.age + 1;
    }

    public void setHeight(int newHeight) {
        this.height = newHeight;
    }

    public void setWeight(int newWeight) {
        this.weight = newWeight;
    }

    public double bodyMassIndex() {
        double heightDivByHundred = this.height / 100.0;
        return this.weight / (heightDivByHundred * heightDivByHundred);
    }

    @Override
    public String toString() {
        return this.name + ", age " + this.age + " years";
    }
}

Das Handling von Objekten in einer Liste unterscheidet sich nicht wesentlich von den bisherigen Erfahrungen, die Sie mit Listen gemacht haben. Der wesentliche Unterschied besteht nur darin, den Typ für die gespeicherten Elemente zu definieren, wenn Sie die Liste erstellen.

Im folgenden Beispiel erstellen wir zuerst eine Liste, die für die Speicherung von Objekten des Typs Person gedacht ist, und fügen anschließend Personen hinzu. Schließlich werden die Personenobjekte nacheinander ausgegeben.

ArrayList<Person> persons = new ArrayList<>();

// ein Personenobjekt kann zuerst erstellt werden
Person john = new Person("John");
// und dann zur Liste hinzugefügt werden
persons.add(john);

// Personenobjekte können auch "im selben Satz", in dem sie erstellt werden, der Liste hinzugefügt werden
persons.add(new Person("Matthew"));
persons.add(new Person("Martin"));

for (Person person: persons) {
    System.out.println(person);
}
Beispielausgabe

John, age 0 years Matthew, age 0 years Martin, age 0 years

Hinzufügen von Benutzereingaben zu einer Liste

Die Struktur, die wir zuvor zum Lesen von Eingaben verwendet haben, ist immer noch sehr nützlich.

Scanner scanner = new Scanner(System.in);
ArrayList<Person> persons = new ArrayList<>();

// Namen von Personen von Benutzerin oder Benutzer lesen
while (true) {
    System.out.print("Enter a name, empty will stop: ");
    String name = scanner.nextLine();
    if (name.isEmpty()) {
        break;
    }

    // Fügen Sie der Liste eine neue Person hinzu,
    // deren Name die vorherige Benutzereingabe ist
    persons.add(new Person(name));
}

// Anzahl der eingegebenen Personen und deren individuelle Informationen ausgeben
System.out.println();
System.out.println("Persons in total: " + persons.size());
System.out.println("Persons: ");

for (Person person: persons) {
    System.out.println(person);
}
Beispielausgabe

Enter a name, empty will stop: Alan Kay Enter a name, empty will stop: Ivan Sutherland Enter a name, empty will stop: Kristen Nygaard

Persons in total: 3 Persons: Alan Kay, age 0 years Ivan Sutherland, age 0 years Kristen Nygaard, age 0 years

Loading

Mehrere Konstruktorparameter

Wenn der Konstruktor mehr als einen Parameter erfordert, können Sie die Benutzerin oder den Benutzer nach weiteren Informationen fragen. Angenommen, wir haben den folgenden Konstruktor für die Klasse Person.

public class Person {

    private String name;
    private int age;
    private int weight;
    private int height;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
        this.weight = 0;
        this.height = 0;
    }

    // Methoden
}

In diesem Fall wird ein Objekt durch Aufruf des Konstruktors mit zwei Parametern erstellt.

Wenn Sie die Benutzerin oder den Benutzer nach einem solchen Objekt fragen möchten, müssen sie für jeden Parameter separat befragt werden. Im folgenden Beispiel werden die Parameter Name und Alter separat von der Benutzerin oder dem Benutzer abgefragt. Das Eingeben eines leeren Namens beendet den Lesevorgang.

Die Personen werden ausgegeben, nachdem sie eingelesen wurden.

Scanner scanner = new Scanner(System.in);
ArrayList<Person> persons = new ArrayList<>();

// Personendaten von Benutzerin oder Benutzer lesen
while (true) {
    System.out.print("Enter name, empty will end: ");
    String name = scanner.nextLine();
    if (name.isEmpty()) {
        break;
    }

    System.out.print("Enter the age of the person " + name + ": ");

    int age = Integer.valueOf(scanner.nextLine());

    // Eine neue Person zur Liste hinzufügen.
    // Der Name und das Alter der Person wurden von der Benutzerin oder dem Benutzer festgelegt
    persons.add(new Person(name, age));
}

// Anzahl der eingegebenen Personen und die Personen selbst ausgeben
System.out.println();
System.out.println("Total number of persons: " + persons.size());
System.out.println("Persons: ");

for (Person person: persons) {
    System.out.println(person);
}
Beispielausgabe

Enter name, empty will end: Grace Hopper Enter the age of the person Grace Hopper: 85 Enter name, empty will end:

Total number of persons: 1 Persons: Grace Hopper, age 85 years

Loading

Gefilterte Ausgabe aus der Liste

Sie können die Objekte in der Liste auch während des Durchlaufens untersuchen. Im folgenden Beispiel fragen wir die Benutzerin oder den Benutzer zunächst nach einer Altersgrenze, danach drucken wir alle Objekte aus, deren Alter mindestens dem von der Benutzerin oder dem Benutzer angegebenen Wert entspricht.

// Angenommen, wir haben eine 'persons'-Liste,
// die Personenobjekte enthält

System.out.print("What is the age limit? ");
int ageLimit = Integer.valueOf(scanner.nextLine());

for (Person person: persons) {
    if (person.getAge() >= ageLimit) {
        System.out.println(person);
    }
}
Loading
Loading
Sie haben das Ende dieses Abschnitts erreicht! Weiter zum nächsten Abschnitt: