Wpis z mikrobloga

#naukaprogramowania #java

Hej, mam klasę User, w niej String dataUrodzenia (oraz opcjonalnie string numerTelefonu) w postaci yyyy-mm-dd zczytywany z txt, chcę iterować listę w pętli

for (User dataUrodzenia : list) {
}

(chyba taka jest dobra) tak, żeby dostać najstarszego użytkownika który numer telefonu posiada, jak to wykombinować? Z góry dzięki, nie mam pojęcia która biblioteka będzie najlepsza i jak to ugryźć.
  • 19
  • Odpowiedz
@dzeksondzekson: zamiast stringa trzymaj datę, np. LocalDate i parsuje do niej przy wczytywaniu
user.date = LocalDate.parse(DateTimeFormatter.ofPattern("yyyy-MM-dd"))

a potem User user = list.stream().filter(u -> u.numerTelefonu != null).max((u1, u2) -> u1.date.compareTo(u2.date));
  • Odpowiedz
@dzeksondzekson: list.stream().filter(maTelefon()).mapReduce(zostawTegoStarszego()).asList().get(0)
Oczywiście metody źle bo z głowy, implementację filtra i redukcji zostawiam, bo trywialne.
:)
  • Odpowiedz
Sorry że wołam znowu ale nie dało się edytować już, takie coś wykombinowałem, co tu jest nie tak? Wypisuje mi wszystkich userów.

@tptak: @AwizisieAkat: @wczoraj: @Kuriozal:

for (User user : list) {

User najstarszyUser = null;

if (najstarszyUser == null) {
najstarszyUser = user;
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf.parse(user.getDataUrodzenia());
Date date2 = sdf.parse(najstarszyUser.getDataUrodzenia());

if(date.getTime() < date2.getTime()) {
najstarszyUser = user;
}
System.out.println(najstarszyUser);
}
  • Odpowiedz
@Kuriozal: Chyba im większy time w milisekundach tym starszy :P btw Działa. Śliczne dzięki. Jeszcze mam ostatnie pytanie, jak rozwiązać to, żeby program wypisywał mi najstarszego, ale z numerem telefonu, czyli jak to porównywać ten string z numerem telefonu i jak to w klasie walidować żeby mógł być null, czy lepiej null czy pusty string?

Jeszcze istotne w tym kontekście jest to, żeby wypisywać nei wiem czy zmieniać w metodzie toString
  • Odpowiedz
@Algeroth: Dzięki, miałem problem z nullem bo wywalało błąd przy zczytywaniu z pliku jeśli pole za przecinkiem było null, wtedy nie chciało zrobić obiektu, ale jak dałem w pliku tekstowym spację to wszystko działa.

Ostatnie 2 pytania.

1. Jak to łatwo zmienić żeby pokazywało wiek zamiast daty urodzenia przy wypisywaniu listy użytkowników, domyślam się że muszę zmienić w toString bo obecnie mam

tego domyślnego wygenerowanego przez IDE, tylko nie wiem jak
  • Odpowiedz
@dzeksondzekson: zrób sobie funkcję, która przyjmuje jako parametr tą datę, i w tej funkcji sparsuj sobie tą date do samego roku i od bieżącego roku (new Date() ) odejmij tą co masz z parametru. I to możesz dla każdego obiektu pozamieniać w tej liście, przy założeniu że dodasz pole Integer iloscLat lub zamienisz tamten atrybut.

Co do testów to polecam poczytać o JUnit. Zaimportować bibliotekę, porobić kilka testów jednostkowych. Polega to
  • Odpowiedz
@Algeroth:

// zamiana daty urodzenia na wiek
for (User user : list) {

Long wiek = obliczWiek(user.getDataUrodzenia());

user.setDataUrodzenia(wiek.toString());
}
}

// obliczanie wieku
private static long obliczWiek(String dataUrodzenia) throws ParseException {

Date urodziny = sdf.parse(dataUrodzenia);
Date teraz = new Date();

@SuppressWarnings("deprecation")
long wiek = teraz.getYear() - urodziny.getYear();

return wiek;
}

Mam takie coś, jakieś pomysły żeby zamienić te przestarzałe getYear na coś innego?

Poza tym wszystko działa.
  • Odpowiedz
@dzeksondzekson

Date date = new Date(); Calendar calendar = new GregorianCalendar(); calendar.setTime(date); int year = calendar.get(Calendar.YEAR); //Add one to month {0 - 11} int month = calendar.get(Calendar.MONTH) + 1; int day = calendar.get(Calendar.DAYOFMONTH)
  • Odpowiedz