Mam mapę skrótu z niższymi wartościami, w wartościach mam datę jako ciąg danych typu. Chciałbym porównać wszystkie daty dostępne na mapie i wyodrębnić tylko jedną kluczową wartość, która ma najnowszą datę.
Chciałbym porównać z wartościami, a nie kluczami.
Podałem kod poniżej
import java.util.HashMap;
import java.util.Map;
public class Test {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("1", "1999-01-01");
map.put("2", "2013-10-11");
map.put("3", "2011-02-20");
map.put("4", "2014-09-09");
map.forEach((k, v) -> System.out.println("Key : " + k + " Value : " + v));
}
}
Oczekiwany wynik dla tego wynosi:
Klucz 4 Wartość 2014-09-09
LocalDate
przedmioty. Reszta kodu będzie prawdopodobnie taka sama, z wyjątkiem deklaracji typu mapy.Odpowiedzi:
Powinno to zapewnić najnowszą (czyli największą) datę w porównaniu z innymi.
Jeśli chcesz również klucz, zrób to i zwróć Map.Entry. Wymaga Java 9+
Zakłada to, że twoja mapa nie jest pusta. jeśli jest pusty, wówczas zwraca null. Działa z Javą 8+
źródło
Użyj Collections.max z entrySet
lub
źródło
Map.Entry.comparingByValue()
Jest ładne (od Javy 8).Na pierwszy rzut oka użycie literałów łańcuchowych do przedstawienia daty nie jest dobrym podejściem i sprawia, że jest bardziej delikatne i podatne na błędy. Wolisz używać
LocalDate
przede wszystkim. Jednak przy założeniu, że nie masz żadnej kontroli nad tym formatem danych (na przykład, że pochodzi on z innego systemu strony trzeciej), nadal możemy opracować podejście, które rozwiązuje dany problem. Oto jak to wygląda.LocalDate.parse
Służy do konwersji znaków reprezentujący datę w formieLocalDate
, która jest porównywalna. JestComparable
to następnie przekazywane jako klucz doComparator
metody budowy. A oto para klucz-wartość wyjściowa po pomyślnym wykonaniu:Jeśli możesz po prostu zrezygnować z reprezentacji ciągu według daty, jak zasugerowano powyżej, możesz uczynić powyższe rozwiązanie o wiele prostszym i zwięzłym.
źródło
To powinno działać
wyjście jest
Optional[4=2014-09-09]
źródło
Możesz parsować ciąg
LocalDate
i sortować go w odwrotnej kolejnościźródło
Możesz zrobić:
lub:
Oba przyniosą ten sam wynik.
źródło
Map.Entry.comparingByValue()
Jest ładne (od Javy 8).