Nur bestimmter Typ aus der ArrayList ausgeben.

Juicerz

Mitglied
Hallo,

Ich habe eine kleine Frage.
Sagen wir ich habe folgende ArrayList:

Java:
ArrayList<Nameable> things = new ArrayList<Nameable>();
things.add(new Person("Paul");
things.add(new Animal("Katze");
things.add(new Device("PC");

Und wenn ich jetzt nur die Personen aus der things-liste ausgeben will, wie mache ich das?
Sagen wir ich schreibe eine Methode dafür:

Java:
public void printPerson() {...}

Dann ist es fast ein muss, dass ich vorher noch eine Methode schreiben muss, die die ganzen Enum-Typen miteinander vergleicht oder? Zb.

Java:
    private ArrayList<Nameable> getAllPerson() {
        ArrayList<Nameable> person = new ArrayList<Nameable>();
        for (Nameable z : things) {
            if (z.isType(Type.Person)) {
                person.add(z);
            }
        }
        return person;
    }

Würde ich das als Grundlage nehmen, müsste die vorherige Methode eigentlich nur noch so aussehen?

Java:
public void printPerson() {
    System.out.println(things.getAllPerson());
}

Oder wie müsste das aussehen? Würde es auch ohne die Service-Methode klappen?

Danke! :)

*Edit: Sorry die isType-Methode bräuchts natürlich auch noch.

Java:
    private boolean isType(Nameable other){
        if (this.nameable == other) {
            return true;
        } else {
            return false;
        }
    }
 
Zuletzt bearbeitet:
K

kneitzel

Gast
Also generell sollte man die Klassen zeigen, um die es hier geht. Was ist nameable so dass da this.nameable verglichen wird in isType?

Und generell gibt es ja die Prüfungen. Damit die Zuweisung geht, muss ja Person, Device und Animal von Nameable erben. Und wenn man prüfen will, ob etwas eine Person ist, ist instanceof wie von @krschon gesagt, das Mittel der Wahl
 

mihe7

Top Contributor
Sagen wir ich habe folgende ArrayList:
Dann bekommst Du einen Fehler (schließende Klammern) :p

Mal ein ausführbares Beispiel, das nur die Elemente des angegebenen Typs ausgibt. Subtypen werden hier nicht berücksichtigt, dafür müsste man in Zeile 30 das equals durch isAssignableFrom ersetzen:
Java:
import java.util.ArrayList;
import java.util.List;

public class Test {

    interface Nameable {
        String getName();
    }

    abstract class AbstractNameable implements Nameable {
        private final String name;
        protected AbstractNameable(String name) { this.name = name; }
        public String getName() { return name; }
    }

    class Person extends AbstractNameable { public Person(String name) { super(name); } }
    class Animal extends AbstractNameable { public Animal(String name) { super(name); } }
    class Device extends AbstractNameable { public Device(String name) { super(name); } }

    private List<Nameable> things = new ArrayList<>();

    public Test() {
        things.add(new Person("Paul"));
        things.add(new Animal("Katze"));
        things.add(new Device("PC"));
    }

    private void print(Class<? extends Nameable> type) {
        for (Nameable thing : things) {
            if (thing.getClass().equals(type)) {
                System.out.println(thing.getName());
            }
        }
    }

    public static void main(String[] args) {
        Test test = new Test();
        System.out.println("Personen: ");
        test.print(Person.class);
    }
}
 
K

kneitzel

Gast
Das Beispiel von @mihe7 einmal kurz erweitert:
a) Einmal instanceof benutzt (printPersons Methode) um zu zeigen, wie man Personen gezielt zeigen kann. So es nicht darum ging, mit Class zu arbeiten dürfte das das Ziel der Lektion sein. Diese Prüfungen kommen durchaus regelmäßig vor, z.B. bei der equals Methode.

Hier ist dann auch der Unterschied zu merken: Wenn man eine weitere Klasse von Person ableitet (Manager), dann ist die Prüfung über die Klasse natürlich unterschiedlich. Aber ein Manager ist natürlich auch eine Person - printPersons gibt auch den Manager aus.

b) Wenn man so ein Verhalten mit dynamisch angegebener Klasse nutzen will, dann ist instanceof nicht wirklich zu gebrauchen. Daher einfach die Prüfung über die Methode isAssignableFrom - wie auch schon von @mihe7 genannt. Aber die Prüfung muss natürlich auch umgedreht werden.
Das aber nur der Vollständigkeit-Halber ... denn ich vermute, dass es um diese Dinge nicht wirklich geht (und ich finde das auch nicht wirklich sinnvoll so zu schreiben....)

c) Wenn ich solche Lösungen unsinnig finde, dann muss ich natürlich eine bessere Lösung angeben. Und so aus dem Stehgreif würde ich da eine Lösung mit Predicate<Nameable> nutzen, was dann zur Methode print(Predicate<Nameable>) führt. Dann kann man bei print beliebig filtern. Soll es ein instanceof sein? Ein getName().toLowerCase().startsWith(...)? Was auch immer - jetzt ist die Methode universell nutzbar...

Java:
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.function.Predicate;

public class Test {

    interface Nameable {
        String getName();
    }

    abstract class AbstractNameable implements Nameable {
        private final String name;
        protected AbstractNameable(String name) { this.name = name; }
        public String getName() { return name; }
    }

    class Person extends AbstractNameable { public Person(String name) { super(name); } }
    class Animal extends AbstractNameable { public Animal(String name) { super(name); } }
    class Device extends AbstractNameable { public Device(String name) { super(name); } }
    class Manager extends Person { public Manager(String name) { super(name); } }

    private List<Nameable> things = new ArrayList<>();

    public Test() {
        things.add(new Person("Paul"));
        things.add(new Animal("Katze"));
        things.add(new Device("PC"));
        things.add(new Manager("Ackermann"));
    }

    private void print(Class<? extends Nameable> type) {
        for (Nameable thing : things) {
            if (thing.getClass().equals(type)) {
                System.out.println(thing.getName());
            }
        }
    }

    private void print2(Class<? extends Nameable> type) {
        for (Nameable thing : things) {
            if (type.isAssignableFrom(thing.getClass())) {
                System.out.println(thing.getName());
            }
        }
    }

    private void printPersons() {
        for (Nameable thing : things) {
            if (thing instanceof Person) {
                System.out.println(thing.getName());
            }
        }
    }

    private void print(Predicate<Nameable> predicate) {
        for (Nameable thing : things) {
            if (predicate.test(thing)) {
                System.out.println(thing.getName());
            }
        }
    }

    public static void main(String[] args) {
        Test test = new Test();
        System.out.println("Personen: ");
        test.print(Person.class);
        System.out.println("====================");
        test.printPersons();
        System.out.println("====================");
        test.print2(Person.class);
        System.out.println("====================");
        test.print(n -> n instanceof Person);
        System.out.println("====================");
        test.print(n -> n.getName().toLowerCase().startsWith("k"));
    }
}
 

Juicerz

Mitglied
Krass... danke! <3

Ich habe noch eine andere "Variante", könnt ihr die auch mal durchchecken. Sollte eigentlich okay so sein. Mir gehts vor allem um die Methode printNovels, die nur die Romane auszudrucken soll.

Wie würde jetzt das Beispiel mit instanceof aussehen? Irgendwie gibt mir das ein Fehler, was fehlt?

Java:
public void printNovels() {
        for (Book z : readingStuff) {
            if (z instanceof Roman) {
                System.out.println(z.getTitle());
            }
        }
}


Java:
public enum Category {
    
    Buch, Magazin, Roman;

}




public class Book {
    
    private String title;
    private Category category;
    private int pages;
    
    public Book(String title, String category, int pages) {
        this.title = title;
        this.category = Category.valueOf(category);
        this.pages = pages;
    }
    
    public String getTitle() {
        return this.title;
    }
    
    public Category getCategory() {
        return this.category;
    }
    
    public String toString() {
        String bookString = this.title + " " + this.category + " " + this.pages;
        return bookString;
    }

}






public class Bookshelf {
    
    private ArrayList<Book> readingStuff;
    
    public Bookshelf() {
        this.readingStuff = new ArrayList<Book>();
    }
    
    public void addBook() {
        Scanner scan = new Scanner(System.in);
        System.out.print("Titel: ");
        String title = scan.nextLine();
        System.out.print("Kategorie: ");
        String category = scan.next();
        System.out.print("Anzahl Seiten: ");
        int pages = scan.nextInt();
        Book b = new Book(title, category, pages);
        readingStuff.add(b);
    }
    
    public void printNovels() {
        for (Book z : readingStuff) {
            if (z.getCategory().equals(Category.Roman)) {
                System.out.println(z.getTitle());
            }
        }
    }

}
 
K

kneitzel

Gast
Du musst unterscheiden zwischen einer Klassenhierarchie (Also Klassen sind in einer Art Baumstruktur voneinander abgeleitet) und einen Werten.

Bei dem ersten Thema, ging es ja darum zu prüfen, von welcher Klasse eine bestimmte Instanz war. Dazu wurde direkt auf die Klasse zugegriffen (getClass()) oder es wurde der instanceof Operator verwendet.

Aber jetzt geht es Dir um einen Wert einer Variable und nicht um den Typ der Instanz in der Variable.
Das mit der Category ist ähnlich wie z.B. ein int, nur das die Menge der Werte unterschiedlich ist (Achtung: Der Vergleich hinkt massiv! Das nur jetzt etwas grob so betrachten. Eine enum ist streng genommen auch eine spezielle class und ist daher mit einem primitiven Typen nicht wirklich vergleichbar!)

Also wenn Du category als int hättest, dann könnte 0: Buch, 1: Magazin, 2: Roman sein.

Und wenn Du alle Romane ausgeben wolltest, dann würdest Du ja schreiben: getCategory() == 2.

Und das wäre hier jetzt 1:1 auch so: getCategory() == Category.ROMAN wäre hier die Bedingung.
(Die Werte eines Enum werden in der Regel komplett in Großbuchstaben geschrieben und zusammengesetzte Wörter werden mit _ getrennt.)
 

temi

Top Contributor
Wenn du schon eine Enumeration für die Kategorie hast, dann solltest du diese auch im Konstruktor verwenden. Das vermindert das Risiko einer "Fehlbedienung" deiner Klasse, denn der String kann ja x-beliebige Werte annehmen, die Kategorie nicht.
Java:
    public Book(String title, Category category, int pages) {
        this.title = title;
        this.category = category;
        this.pages = pages;
    }

Die Methode printNovels() könnte man auch noch etwas flexibler auslegen:
Java:
    public void print(Category category) {
        for (Book book : readingStuff) { // "z" nach "book" geändert, weil "z" ein schlechter Name ist.
            if (book.getCategory().equals(category)) {
                System.out.println(book.getTitle());
            }
        }
    }

// Man könnte jetzt noch Convenience Methoden ergänzen, was allerdings nicht generell sinnvoll ist.

    public void printNovels() {
        print(Category.ROMAN);
    }

Zuletzt noch: Da immutable Klassen vorzuziehen sind und sich ein Buch ja nicht mehr ändert (du hast ja bereits keine Setter), könnte man die Instanzvariablen auch final deklarieren. Ich persönlich mach alles final, was sich nicht mehr ändern soll. Das drückt auch meine Intention für andere aus, die vielleicht meinen Code irgendwann einmal lesen.
Java:
    private final String title;
    private final  Category category;
    private final int pages;
 
Zuletzt bearbeitet:
K

kneitzel

Gast
if (book.getCategory().equals(category)) {
Da aber noch der Hinweis: category könnte auch null sein, d.h. entweder null ebenfalls prüfen oder dann doch auf == wechseln.

JLS 8.9.1 erlaubt dies ja auch explizit:
Because there is only one instance of each enum constant, it is permitted to use the == operator in place of the equals method when comparing two object references if it is known that at least one of them refers to an enum constant.
Ich kann zwar verstehen, dass dies bei Instanzen (und darum handelt es sich ja bei Enum Werten) ungeohnt ist, aber das wäre ein Weg.

Oder eben das
Java:
Objects.equals(book.getCategory(), category)
käme noch als Alternative in Frage....
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
staxx6 ArrayList Methoden aufrufen bestimmter Klassen Java Basics - Anfänger-Themen 4
X Collections Reihenfolge bestimmter Objekte in einer ArrayList verändern Java Basics - Anfänger-Themen 2
L Zeichen an bestimmter Stelle auslesen Java Basics - Anfänger-Themen 4
S If Abfrage nur mit bestimmter Initialisierung? Java Basics - Anfänger-Themen 8
B Vererbung Abgeleitete Klassen Bestimmter Typ zuweisen Java Basics - Anfänger-Themen 2
C Zeichen im String bis zu bestimmter Stelle entfernen Java Basics - Anfänger-Themen 6
S Einfach verkettete Liste Element an bestimmter Position einfügen Java Basics - Anfänger-Themen 24
E Wenn i (for-Loop) bestimmter Wert, dann neue Zeile eines Buttons Java Basics - Anfänger-Themen 7
A Erste Schritte Programm in Shell mit bestimmter Java-Version aufrufen Java Basics - Anfänger-Themen 10
S Prüfen ob bestimmter Ordner geöffnet ist (Windows XP) Java Basics - Anfänger-Themen 5
S Zahl an bestimmter Stelle splitten Java Basics - Anfänger-Themen 6
F Text anhand bestimmter Trennzeichen in Textteile trennen (netbeans) Java Basics - Anfänger-Themen 7
C Anzahl bestimmter Zeichen in einem String ausgeben Java Basics - Anfänger-Themen 7
T Anzahl bestimmter Werte eines arrays bestimmen Java Basics - Anfänger-Themen 4
R Split ab bestimmter Stelle Java Basics - Anfänger-Themen 9
J Object bestimmter Klasse Java Basics - Anfänger-Themen 3
C auslesen bestimmter werte einer textdatei und anschl. hineinschreiben in eine neue txt-datei. Java Basics - Anfänger-Themen 2
E Zufall bestimmter Zahlen Java Basics - Anfänger-Themen 2
J Bestimmter Teil aus Zeichenfolge Java Basics - Anfänger-Themen 2
J Neue Zeile an bestimmter Stelle in Textdatei einfügen Java Basics - Anfänger-Themen 2
J Text kopieren an bestimmter Stelle Java Basics - Anfänger-Themen 8
O Quellcode nach bestimmter Ausgabe durchsuchen Java Basics - Anfänger-Themen 14
D Char Array ab bestimmter Stelle in neuem Speichern Java Basics - Anfänger-Themen 13
B Zählen bestimmter Zeilen einer .txt Java Basics - Anfänger-Themen 7
S an bestimmter stelle löschen / einfügen Java Basics - Anfänger-Themen 5
D Meldung zu bestimmter Uhrzeit Java Basics - Anfänger-Themen 9
S Animation nach bestimmter Zeit ausführen Java Basics - Anfänger-Themen 3
-horn- Double nach bestimmter Nachkommastelle abschneiden. Java Basics - Anfänger-Themen 2
B Java nach bestimmter dateiendung suchen Java Basics - Anfänger-Themen 6
D Ab bestimmter stelle lesen Java Basics - Anfänger-Themen 3
K OOP Aus Collection Objekte bestimmter Subklassen entfernen Java Basics - Anfänger-Themen 7
S Ausgabe bestimmter Attribute Java Basics - Anfänger-Themen 5
V Buffered Reader, erst ab bestimmter Zeile auslesen? Java Basics - Anfänger-Themen 8
T Buchstaben an bestimmter Stelle aus String lesen Java Basics - Anfänger-Themen 5
D Dateizugriff - An bestimmter Position Lesen (Random Access) Java Basics - Anfänger-Themen 2
M Erneutes Ausführen bestimmter Aktionen (GoTo-Alternative) Java Basics - Anfänger-Themen 6
G Programm soll nach bestimmter Zeit etwas tun Java Basics - Anfänger-Themen 24
P Bestimmter befehl der nicht klappt Java Basics - Anfänger-Themen 5
J mouseover Text => Bildanzeige an bestimmter Position.Wie Java Basics - Anfänger-Themen 2
H Datei lesen und an bestimmter Stelle schreiben Java Basics - Anfänger-Themen 4
G Zeichen an bestimmter Stelle im String einfügen. Java Basics - Anfänger-Themen 4
P JOptionPane bei bestimmter Uhrzeit anzeigen Java Basics - Anfänger-Themen 2
T Event zu bestimmter Uhrzeit auslösen ? Java Basics - Anfänger-Themen 5
G Methode nach bestimmter Zeit aufrufen Java Basics - Anfänger-Themen 3
krgewb ArrayList allgemein halten Java Basics - Anfänger-Themen 6
M Ausgabe einer ArrayList ensteht nur als Hashcode, nicht als Objekt Java Basics - Anfänger-Themen 16
S Java: Wie sortiere ich eine ArrayList benutzerdefinierter Objekte nach einem bestimmten Attribut? Java Basics - Anfänger-Themen 2
J ArrayList in 2D-Array konvertieren. Java Basics - Anfänger-Themen 48
E Arrays in einer ArrayList miteinander vergleichen Java Basics - Anfänger-Themen 12
String in ArrayList umwandeln Java Basics - Anfänger-Themen 1
F Arraylist<String>Ein Wort pro Zeile Java Basics - Anfänger-Themen 6
J ArrayList vergleichen im spiel Mastermind Java Basics - Anfänger-Themen 2
Mugetsu35 ArrayList Update ohne Index Java Basics - Anfänger-Themen 6
W Objekte einer ArrayList in txt-datei schreiben mit Paths? Java Basics - Anfänger-Themen 2
Z Java ArrayList speichert falsche Daten ab bzw. gibt falsche Daten aus? Java Basics - Anfänger-Themen 42
W if-Abfrage bei ArrayList-Methodenaufrufen - Wie löse ich das? Java Basics - Anfänger-Themen 6
W ArrayList und toString Java Basics - Anfänger-Themen 17
volcanos Addition -> List<Integer> mit Arrays.asList() versus List<Integer>ArrayList<>() Java Basics - Anfänger-Themen 14
ArrayList mit unbekannter Menge an Arrays die Arrays vergleichen Java Basics - Anfänger-Themen 9
M 2d ArrayList durchgehen Java Basics - Anfänger-Themen 2
Blkckroll45 Arraylist Java Basics - Anfänger-Themen 6
H Interface Wieso "List<String> list = new ArrayList<>[…]" Java Basics - Anfänger-Themen 4
berserkerdq2 Geht collections.sort bei allen? Linkedhashset, ArrayList, HashSet etc. Java Basics - Anfänger-Themen 4
R Methoden Werte einer ArrayList als Parameter übergeben. Java Basics - Anfänger-Themen 4
L Dauerhaftes Speichern einer Eingabe bei einer ArrayList Java Basics - Anfänger-Themen 26
D Arraylist mit Komplexen Datentyp Java Basics - Anfänger-Themen 3
H Kompliziertes Sortieren einer ArrayList mit Objekten(Sortieren nach X und Y) Java Basics - Anfänger-Themen 11
T Permanentes speichern von Objekten in einer ArrayList Java Basics - Anfänger-Themen 6
volcanos List & ArrayList nach Familiennamen abfragen Java Basics - Anfänger-Themen 57
M static ArrayList in non-static Java Basics - Anfänger-Themen 12
berserkerdq2 Ich gebe eine ArrayList als List zurück per MEthode, wie kann ich nun aber die ArrayList speichern? Java Basics - Anfänger-Themen 46
M ArrayList<TreeNode<T>> fortlaufende Nummerierung der Elemente Java Basics - Anfänger-Themen 5
B Bungeecord | ProxiedPlayer wird nicht in ArrayList hinzugefügt Java Basics - Anfänger-Themen 1
S ArrayList Username und passwort mit JTextField eingaben abgleichen Java Basics - Anfänger-Themen 10
F Werte in einer Arraylist Zählen Java Basics - Anfänger-Themen 2
F Erste Schritte Zahlenreihe von Arraylist in 3erBlöcke sortiert in neue Arraylist Java Basics - Anfänger-Themen 2
M ArrayList mit einer Schleife befüllen Java Basics - Anfänger-Themen 2
F Methode ArrayList mit Eingabewert Java Basics - Anfänger-Themen 2
J ArrayList add methode selbst programmieren Java Basics - Anfänger-Themen 10
K Erste Schritte Wie schnell ist LinkedHashMap im Vergleich zur ArrayList, wenn alle Entries durchlaufen werden? Java Basics - Anfänger-Themen 47
thobren jtable arraylist Java Basics - Anfänger-Themen 12
N Exception beim Verwenden von Arraylist? Java Basics - Anfänger-Themen 10
P Schiebefix - ArrayList überschreibt Daten Java Basics - Anfänger-Themen 3
Zeppi OOP ArrayList Java Basics - Anfänger-Themen 2
P ArrayList Java Basics - Anfänger-Themen 4
L ArrayList auf 4 Elemente begrenzen Java Basics - Anfänger-Themen 56
C ArrayList sortieren nach bestimmten Buchstaben in den Wörtern Java Basics - Anfänger-Themen 13
S Arraylist<Object> mit verschiedenen Objects ausgeben Java Basics - Anfänger-Themen 3
J ArrayList auf bereits vorhanden eintrag prüfen Java Basics - Anfänger-Themen 5
M For Schleife/ArrayList Java Basics - Anfänger-Themen 12
L ArrayList<String> --> double[] array Java Basics - Anfänger-Themen 18
L Längstes Element einer ArrayList ausgeben Java Basics - Anfänger-Themen 9
S Aus verschachtelter ArrayList auf einen Wert zugreifen Java Basics - Anfänger-Themen 4
L Methoden ArrayList Werte hinzufügen und löschen Java Basics - Anfänger-Themen 32
M ArrayList in GUI ausgeben Java Basics - Anfänger-Themen 1
Bademeister007 Hallo Leute ich hab eine Frage zur ArrayList Java Basics - Anfänger-Themen 8
Bademeister007 Operatoren Alle Zahlen einer ArrayList die durch 5 teilbar ist Java Basics - Anfänger-Themen 2
S Objekt aus Arraylist in andere Arraylist kopieren? Java Basics - Anfänger-Themen 2
C Sortieren einer ArrayList Java Basics - Anfänger-Themen 2
krgewb ArrayList von ArrayList Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben