Sortowanie i wyświetlanie wyników z dwóch list

0

Cześć Panowie. Sytuacja u mnie wygląda tak, że posiadam dwie ArrayListy, z których każda zawiera inny typ obiektu. Częścią składową obu obiektów jest LocalDate. Chciałbym wyświetlić elementy z obu list, posortowane wg LocalDate, w zależności od tego, które wydarzyło się wcześniej.

Dla łatwiejszego operowania i pomijania w algorytmie obiektów, metod itp, przyjmijmy, że są to dwie listy Integerów i chcemy je wyświetlić posortowane w kolejności rosnącej.

Lista nr 1 : 1, 2 , 5, 6, 9, 12
Lista nr 2 : 3, 4, 7, 8, 10, 11

Czy macie może pomysł na algorytm, który po przemieleniu obu list wypluł by wynik 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ? Oczywiście zakładając z góry, że nie możemy tych list połączyć w jedną i posortować :D

1

A co stoi na straży tego, że list nie można łączyć?

0

To, że są to listy zawierające dwa różne obiekty. Jedna to jest ArrayList<Expenditure>, druga ArrayList<Income>, chyba, że o czymś nie wiem i można takie listy elegancko łączyć :P

1

Stwórz dwuelementową tablicę z obiema listami. Trzymasz w zmiennej informację, po której z nich właśnie iterujesz (początkową wartość ustalasz na podstawie tego, na której liście pierwszy element jest mniejszy). Robisz while dopóki obie listy nie będą przelecone do końca, tam porównujesz aktualny element z jednej i z drugiej listy i zgodnie z tym budujesz listę wynikową oraz przesuwasz indeks. W sytuacji kiedy "ta druga" lista będzie zawierała wartość niższą przestawiasz zmienną wskazującą, która lista jest obecnie główna.

Dodatkowo możesz sobie poczytać o sortowaniu przez scalanie, bo tam właśnie krokiem pośrednim jest scalanie posortowanych tablic.

Edit: przypomniało mi się ze studiów, że w matematyce jest taka piękna nazwa, "zmienna indykatorowa" :D

0

Możesz zmapowac dwóch list do LocalDate, połączyć je (Stream.concat) i posortować według comparatora z LodalDate

List<Expenditure> expenditures = Arrays.asList(expenditure1, expenditure2);
List<Income> incomes = Arrays.asList(income1, income2);

List<LocalDate> expenditureDates = expenditures.stream()
        .map(Expenditure::getDate)
        .collect(Collectors.toList());

List<LocalDate> incomeDates = incomes.stream()
        .map(Income::getDate)
        .collect(Collectors.toList());

List<LocalDate> dates = Stream.concat(expenditureDates.stream(), incomeDates.stream())
        .sorted()
        .collect(Collectors.toList());

Możesz też dodać interfejs w każdej tej klasie która zwraca LocalDate getDate(), wówczas dzięki polimorfizmowi możesz od razu dodać 2 listy, zmapować i je posortować

3

Napisz klasę wrappującą typy i wrzuć je do jednego wora. Jakiś adapter w stylu:

interface MyAdapter {
    LocalDate getDate(); // do sortowania
    Object getValue(); // do pobierania obiektow twoich typów
}
0

Można też przemapować obiekty na krotki zawierające datę oraz obiekt typu Object i wrzucić je do jednej listy. Tylko potem trzeba będzie rzutować obiekty jeśli chcesz użyć coś więcej niż toString(). Zasadnicze pytanie czy to ma tylko działać czy są jakieś dodatkowe wymagania, typu wydajność lub zajęcie pamięci.

0

Nie ma zadnych wymagan dotyczacych wydajnosci badz pamieci, ot, zwykla praca inzynierska :)

Dzieki Panowie. Czego sie nauczylem, to tego, ze musze poczytac o mapowaniu, bo ten temat na razie jest mi obcy, a widze, ze pojawia sie on w propozycjach wiekszosci z was. Osobiscie sam bym sie skazal na meczarnie i probowal zrobic to algorytmicznie przy pomocy ifow i petli, ale widze, ze sa bardziej eleganckie rozwiazania tego problemu :)

kixe52 - sam wiesz, jak jest z programowaniem. Ilosc materialu do opanowania jest tak ogromna, ze trzeba sobie to podzielic na "tym zajme sie teraz', "tamtym zajme sie pozniej" :) Teraz widze, ze nadszedl juz czas na zajecie sie mapowaniem, gdyz w koncu trafilem na problem, ktory mapowanie rozwiazuje. Wczesniej byla to taka "ciekawostka" :)

0

Rozwiązanie bezpieczne ze względu na typy bez rzutowania to typ List<Tuple2<LocalDate, Either<Type1, Type2>>>, gdzie:

Potem wystarczy to posortować za pomocą komparatora

0

dzięki wielkie ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1