Преобразование Arraylists с абстрактными объектами - PullRequest
0 голосов
/ 28 мая 2018

Доброе утро всем,

Во время написания моего GUI я столкнулся с проблемой с моим Arraylist.В моем классе Vereniging есть ArrayList, содержащий объекты Persoon, которые являются либо Lid, либо Medewerker.Теперь мне нужно отфильтровать все объекты Lid из этого списка и создать новый Arraylist с объектами Lid.Кто-нибудь знает возможно ли это?Я попытался запустить расширенный цикл for и добавить объекты в новый Arraylist, но он говорит, что тип данных не соответствует (пытается добавить Persoon в список Lid)

Classes;

Vereniging

public class Vereniging {

private String naam;

private ArrayList<Persoon> personen;
private ArrayList<Vliegtuig> vliegtuigen;
private ArrayList<Vlucht> vluchten;
private ArrayList<Hangaar> hangaars;

private DataHandler handler = new Database();

public Vereniging(String naam){
    this.naam = naam;

    personen = new ArrayList<>();
    vliegtuigen = new ArrayList<>();
    vluchten = new ArrayList<>();
    hangaars = new ArrayList<>();
}

public ArrayList<Persoon> getPersonen() {
    return personen;
}

Персона

public abstract class Persoon implements Comparable<Persoon>{

private String voornaam;
private String tussenvoegsel;
private String achternaam;
private String woonplaats;
private String geslacht;
private String rekeningnr;

Persoon(String voornaam, String tussenvoegsel, String achternaam, String 
woonplaats,
               String geslacht, String rekeningnr){
    this.voornaam = voornaam;
    this.tussenvoegsel = tussenvoegsel;
    this.achternaam = achternaam;
    this.woonplaats = woonplaats;
    this.geslacht = geslacht;
    this.rekeningnr = rekeningnr;
}

Крышка

public class Lid extends Persoon {

private String gebnaam;
private String wachtwoord;
private String rol;

public Lid(String voornaam, String tussenvoegsel, String achternaam, String woonplaats, String geslacht,
           String rekeningnr, String gebnaam, String wachtwoord, String rol) {
    super(voornaam, tussenvoegsel, achternaam, woonplaats, geslacht, rekeningnr);
    this.gebnaam = gebnaam;
    this.wachtwoord = wachtwoord;
    this.rol = rol;
}

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Как я вижу, вы хотите добавить объект parent в список массивов дочернего типа.Поэтому, когда вы просматриваете список персонала, проверьте тип персонала, используя instanceOf , затем введите case в Lid и добавьте его в новый список.

Надеюсь, это решит вашу проблему.

Более расширенное решение может быть следующим:

personen.stream().filter(p->p instanceOf Lid).map(p->(Lid)p).collect(Collectors.toList());

, используя потоковый API Java 8, вы можете сделать это в одной строке.Спасибо!

0 голосов
/ 28 мая 2018

Вы можете использовать оператор сравнения типов: instanceof.Это позволяет сравнивать, является ли переменная экземпляром класса (или подкласса).

См. Следующий пример, который перебирает список personen, а затем использует instanceof, чтобы определить, действительно ли этоявляется экземпляром Lid или нет:

List<Lid> lids = new ArrayList<>();
for(Persoon persoon : personen){
    if(persoon instanceof Lid){
        // safe cast and add to lids
        lids.add((Lid) persoon);
    }
}

Если вам случится использовать Java 8, вы можете использовать новый Stream API:

List<Lid> lids = personen.stream() // create a stream of persoonen
    .filter(Lid.class::isInstance) // equivalent to using instanceof
    .map(Lid.class::cast)          // equivalent to casting
    .collect(Collectors.toList()); // creating a list
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...