• Wir präsentieren Dir heute ein Stellenangebot für einen Frontend-Entwickler Angular / Java in Braunschweig. Hier geht es zur Jobanzeige

Nur bestimmter Typ aus der ArrayList ausgeben.

J

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:
kneitzel

kneitzel

Top Contributor
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

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);
    }
}
 
kneitzel

kneitzel

Top Contributor
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"));
    }
}
 
J

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());
            }
        }
    }

}
 
kneitzel

kneitzel

Top Contributor
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

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:
kneitzel

kneitzel

Top Contributor
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
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
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
R ArrayList Problem Java Basics - Anfänger-Themen 6
jonny_2k12 Wie kann ich eine ArrayList aus einer Klasse in eine andere übergeben? Java Basics - Anfänger-Themen 21
O Namen (mit Umlauten und ß) in einer ArrayList suchen Java Basics - Anfänger-Themen 5
N Typebound Objekte einer Arraylist hinzufügen Java Basics - Anfänger-Themen 7
R Methoden ArrayList clonen wirft exception Java Basics - Anfänger-Themen 3
S ArrayList in andere Klasse übernhemen Java Basics - Anfänger-Themen 5
M Letztes Element einer ArrayList Java Basics - Anfänger-Themen 12
B Objektverwaltung mit ArrayList in einer seperaten Klasse Java Basics - Anfänger-Themen 24
I Sortiert eine HashMap nicht gleich wie eine ArrayList? Java Basics - Anfänger-Themen 1
I ArrayList erstellen innerhalb einer Zeile? Java Basics - Anfänger-Themen 3
L Iterieren durch eine ArrayList. Integer Array wird übergeben Java Basics - Anfänger-Themen 17
V Collections ArrayList mit Comparator sortieren Java Basics - Anfänger-Themen 16
D Collections Arrays in ArrayList abspeichern Java Basics - Anfänger-Themen 6
F java.util.ArrayList Java Basics - Anfänger-Themen 3
M ArrayList - Objekt kopieren und ändern Java Basics - Anfänger-Themen 11
M Zugriff auf eine ArrayList in einer anderen Klasse Java Basics - Anfänger-Themen 4
P Arraylist zu einem Array bringen mit Verschachtelung Java Basics - Anfänger-Themen 11
N Methode mit einer Arraylist Java Basics - Anfänger-Themen 106
I ArrayList - Methode zum Speichern eines Eintrags in einer Datei Java Basics - Anfänger-Themen 17
H ArrayList Java Basics - Anfänger-Themen 7
D public ArrayList(Collection<? extends E> c); Java Basics - Anfänger-Themen 2
M JTextField in ArrayList speichern Java Basics - Anfänger-Themen 4
C ArrayList mit return zurückgeben Java Basics - Anfänger-Themen 13
K Zahlenfolge ArrayList Java Basics - Anfänger-Themen 3
C Erste Schritte Frage zur ArrayList Java Basics - Anfänger-Themen 15
I Klassen Eine ArrayList<Long>, die sich automatisch sortiert Java Basics - Anfänger-Themen 20
F Array in ArrayList ablegen Java Basics - Anfänger-Themen 3
V ArrayList Java Basics - Anfänger-Themen 1
Z Runden Arraylist Java Basics - Anfänger-Themen 9
X Frage zur einer ArrayList in einer ArrayList Java Basics - Anfänger-Themen 5
F Arraylist als Pfadausgabe Java Basics - Anfänger-Themen 10
L Daten aus ArrayList in Datenbank durchsuchen Java Basics - Anfänger-Themen 5
L Objekt aus Textdatei in ArrayList speichern Java Basics - Anfänger-Themen 4
M Problem mit ArrayList Java Basics - Anfänger-Themen 32
X Objekte einer ArrayList richtig ausgeben? Java Basics - Anfänger-Themen 8
O Hashmap, ArrayList, LinkedList Java Basics - Anfänger-Themen 7
X Problem mit Arraylist in Arraylist Java Basics - Anfänger-Themen 2
O HashMap - ArrayList Java Basics - Anfänger-Themen 29
M UML-Klassendiagramm ArrayList Java Basics - Anfänger-Themen 1
O ArrayList oberflächig durchsuchen Java Basics - Anfänger-Themen 3
I "\n" aus ArrayList enfernen, aber wie?! Java Basics - Anfänger-Themen 4
V Collections Objekte einer ArrayList in der main() ausgeben Java Basics - Anfänger-Themen 9
Jackii ArrayList ausgabe ohne Dopplung Java Basics - Anfänger-Themen 11
N ArrayList in eigener Klasse erzeugen mit Zugriff Java Basics - Anfänger-Themen 7
B ArrayList besitzt einen Wert zu wenig Java Basics - Anfänger-Themen 16
UnknownInnocent Variablen ArrayList aufteilen Java Basics - Anfänger-Themen 2
UnknownInnocent Datentypen Objekt lässt sich nicht zu arraylist hinzufügen Java Basics - Anfänger-Themen 2
UnknownInnocent Datentypen Integer ArrayList sortieren Java Basics - Anfänger-Themen 2
D new arraylist (List) dynamisch erstellen Java Basics - Anfänger-Themen 1
S ArrayList.add Falsches Argument? Java Basics - Anfänger-Themen 1
D remove arraylist by id not work Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Anzeige

Neue Themen


Oben