Estou tendo um mapa de hash com valores abaixo, em valores que eu tenho como tipo de dados string. Gostaria de comparar todas as datas disponíveis no mapa e extrair apenas um valor-chave com uma data muito recente.
Eu gostaria de comparar com valores e não chaves.
Eu incluí o código abaixo
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));
}
}
A saída esperada para este é:
Valor-chave 4 09-09-2014
LocalDate
objetos. O restante do código provavelmente será o mesmo, salve a declaração do tipo do mapa.Respostas:
Isso deve fornecer a data mais recente (também conhecida como maior) em comparação com as outras.
Se você também deseja a chave, faça isso e retorne um Map.Entry. Requer Java 9+
Isso pressupõe que seu mapa não esteja vazio. se estiver vazio, ele retornará um nulo. Funciona com Java 8 ou superior
fonte
Use Collections.max com entrySet
ou
fonte
Map.Entry.comparingByValue()
é bacana (desde o Java 8).À primeira vista, o uso de literais String para representar Data não é uma boa abordagem e a torna mais frágil e propensa a erros. Você prefere usar
LocalDate
em primeiro lugar. No entanto, com a suposição de que você não tem controle sobre esse formato de dados (por exemplo, é proveniente de outro sistema de terceiros), ainda podemos conceber uma abordagem que resolva o problema em questão. Aqui está como fica.O
LocalDate.parse
é usado para converter a representação em cadeia da data em umaLocalDate
que é comparável. IssoComparable
é passado como uma chave para oComparator
método de construção. E aqui está o par de valores-chave de saída após a execução bem-sucedida:Se você pode simplesmente dispensar a representação String da data, conforme sugerido acima, poderá tornar a solução acima muito mais simples e sucinta.
fonte
Isso deve funcionar
saída é
Optional[4=2014-09-09]
fonte
Você pode analisar a sequência
LocalDate
e ordená-la na ordem inversafonte
Você pode:
ou:
Ambos produzirão o mesmo resultado.
fonte
Map.Entry.comparingByValue()
é bacana (desde o Java 8).