자바의 주어진지도 값에서 최신 날짜를 찾는 방법


10

문자열 데이터 유형으로 날짜 값을 가진 아래 값을 가진 해시 맵이 있습니다. 지도에서 사용할 수있는 모든 날짜를 비교하고 최근 날짜가있는 하나의 키-값 만 추출하고 싶습니다.

키가 아닌 값과 비교하고 싶습니다.

아래 코드를 포함 시켰습니다

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));
    }

}

이것에 대한 예상 출력은 다음과 같습니다.

핵심 4 가치 2014-09-09


그는 가장 큰 값을 필요로하지 키
mangusta


설계 오류. 날짜를 문자열로지도에 넣지 마십시오. LocalDate물건을 넣습니다 . 코드의 나머지 부분은지도 유형의 선언을 저장하는 것과 동일 할 것입니다.
Ole VV

답변:


1

이 날짜는 다른 날짜와 비교하여 최신 날짜를 제공해야합니다.

      String max = map.values().stream().reduce("0000-00-00",
            (a, b) -> b.compareTo(a) >= 0 ? b
                  : a);

키를 원하면이 작업을 수행하고 Map.Entry를 반환하십시오. Java 9 이상이 필요합니다

         Entry<String, String> ent =
            map.entrySet().stream().reduce(Map.entry("0", "0000-00-00"),
                  (a, b) -> b.getValue().compareTo(a.getValue()) >= 0 ? b
                        : a);

         System.out.println(ent.getKey() + " -> " ent.getValue());

이것은지도가 비어 있지 않은 것으로 가정합니다. 비어 있으면 null을 반환합니다. Java 8 이상에서 작동

        Entry<String, String> ent = map.entrySet().stream().reduce(
            (a, b) -> b.getValue().compareTo(a.getValue()) >= 0 ? b
                  : a).orElseGet(() -> null);

결과적으로 키를 얻는 방법?
그루비를 배우십시오

내 추가를 참조하십시오. 당신은 단지 가치를 원한다고 생각했습니다. Mea Culpa.
WJS

나는 새로운 코드 오류를 받고 있어요 -의 Map.Entry를 ( "0", "0000-00-00") -이 방법의 Map.Entry이 유형에 대해 정의되지 말한다지도 ..
그루비 학습

Java 9보다 오래된 것을 실행해야합니다 (추가 된 시점). 대안을 제시하고 설명하겠습니다.
WJS

네, 자바 8 사용하고 있습니다
그루비 학습

6

entrySet 과 함께 Collections.max 사용

Entry<String, String> max = Collections.max(map.entrySet(), Map.Entry.comparingByValue());

또는

Entry<String, String> max = Collections.max(map.entrySet(),
    new Comparator<Entry<String, String>>() {
        @Override
        public int compare(Entry<String, String> e1, Entry<String, String> e2) {
            return LocalDate.parse(e1.getValue()).compareTo(LocalDate.parse(e2.getValue()));
        }
});

Map.Entry.comparingByValue()멋진입니다 (자바 8부터).
Ole VV

4

언뜻보기에 String 리터럴을 사용하여 Date를 나타내는 것은 좋은 접근 방식이 아니며 더 취약하고 오류가 발생하기 쉽습니다. LocalDate처음부터 사용 하는 것이 좋습니다 . 그러나 해당 데이터 형식을 제어 할 수 없다는 가정하에 (예를 들어, 다른 타사 시스템에서 오는 경우 등), 당면한 문제를 해결하는 접근 방식을 여전히 고안 할 수 있습니다. 그 모습은 다음과 같습니다.

Entry<String, String> maxEntry = map.entrySet().stream()
    .max(Comparator.comparing(e -> LocalDate.parse(e.getValue())))
    .orElseThrow(IllegalArgumentException::new);

LocalDate.parse으로 날짜의 문자열 표현을 변환하는 데 사용됩니다 LocalDate유사한이다. 그런 Comparable다음 Comparator시공 방법 의 열쇠로 전달됩니다 . 성공적인 실행시 출력 키-값 쌍은 다음과 같습니다.

4=2014-09-09

위에서 제안한 날짜의 문자열 표현을 생략 할 수 있다면 위의 솔루션을 훨씬 간단하고 간결하게 만들 수 있습니다.

Entry<String, LocalDate> maxEntry = map.entrySet().stream()
    .max(Map.Entry.comparingByValue())
    .orElseThrow(IllegalArgumentException::new);

3

이 작동합니다

    Optional<Map.Entry<String, String>> result = map.entrySet().stream().max(Comparator.comparing(Map.Entry::getValue));
    System.out.println(result);

출력은 Optional[4=2014-09-09]


감사합니다, 사랑은 ...하지만 결과의 핵심을 찾고 있어요
그루비 학습

1

문자열을 구문 분석하고 LocalDate역순으로 정렬 할 수 있습니다

 Entry<String, String> res = map.entrySet()
                                .stream()
                                .sorted(Comparator.comparing((Entry<String, String> entry)->LocalDate.parse(entry.getValue())).reversed())
                                .findFirst()
                                .orElse(null);  // if not present return null or empty Entry

1

다음 중 하나를 수행 할 수 있습니다.

import java.util.Map.Entry;

Entry<String, String> maxEntry = map.entrySet()
                                    .stream()
                                    .max(Entry.comparingByValue());
                                    .orElseThrow(NoSuchElementException::new);   

또는 :

Entry<String, String> max = Collections.max(map.entrySet(), Entry.comparingByValue());

둘 다 동일한 결과를 생성합니다.


Map.Entry.comparingByValue()멋진입니다 (자바 8부터).
Ole VV
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.