जावा में दिए गए मानचित्र मान से नवीनतम तिथि कैसे प्राप्त करें


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


उसे सबसे बड़े मूल्य की जरूरत है, कुंजी की नहीं
— मंगल


डिज़ाइन त्रुटि। तार के रूप में अपनी तारीखों को अपने नक्शे में न रखें। LocalDateवस्तुओं को रखो । बाकी कोड संभवतः समान होंगे, नक्शे के प्रकार की घोषणा को बचाएंगे।
— ओले वीवी

जवाबों:


1

यह दूसरों की तुलना में नवीनतम (उर्फ सबसे बड़ी) तारीख प्रदान करना चाहिए।

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

यदि आप भी कुंजी चाहते हैं, तो यह करें और एक Map.Entry वापस करें। जावा 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());

यह मान लेता है कि आपका नक्शा गैर-रिक्त है। यदि यह खाली है, तो यह एक शून्य देता है। जावा 8+ के साथ काम करता है

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

परिणामस्वरूप कुंजी कैसे प्राप्त करें?
— सीखें

मेरा जोड़ देखिए। सोचा था कि तुम सिर्फ मूल्य चाहते थे। मेया कुल्पा।
— WJS

मुझे आपके नए कोड - Map.entry ("0", "0000-00-00") के साथ एक त्रुटि मिल रही है - यह कहता है कि Method map.entry मानचित्र के लिए अपरिभाषित है ..
— सीखें groovy

आपको जावा 9 (जो तब जोड़ा गया था) से अधिक पुराना होना चाहिए। मैं एक विकल्प पेश करूंगा और उसे समझाऊंगा।
— WJS

हाँ, मैं Java 8 का उपयोग कर रहा हूँ
— groovy

6

उपयोग Collections.max साथ entrySet

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 के बाद से)।
— ओले वीवी

4

पहली नज़र में, तारीख का प्रतिनिधित्व करने के लिए स्ट्रिंग शाब्दिक का उपयोग करना एक अच्छा दृष्टिकोण नहीं है और यह अधिक नाजुक और त्रुटि प्रवण बनाता है। आप 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]


धन्यवाद, प्रिय .. लेकिन मैं परिणाम में कुंजी की तलाश कर रहा हूं
— groovy

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 के बाद से)।
— ओले वीवी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.