জাভাতে প্রদত্ত মানচিত্রের মান থেকে সর্বশেষতম তারিখটি কীভাবে সন্ধান করতে হবে


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বস্তু রাখুন । বাকি কোডগুলি সম্ভবত একই রকম হবে, মানচিত্রের ধরণের ঘোষণা সংরক্ষণ করুন save
ওলে ভিভি

সম্পর্কিত: সর্বাধিক মান সহ মানচিত্রের কীগুলি সন্ধান করা (সমতা হতে পারে) (স্ট্যাক এক্সচেঞ্জ কোড পর্যালোচনাতে)।
ওলে ভিভি

উত্তর:


1

এটি অন্যদের তুলনায় নতুন (ওরফে বৃহত্তম) তারিখ সরবরাহ করা উচিত।

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

আপনি যদি কীটিও চান, তবে এটি করুন এবং একটি মানচিত্র.এন্ট্রি ফিরিয়ে দিন। জাভা 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);

ফলস্বরূপ কী কীভাবে পাবেন?
গ্রোভি শিখুন

আমার সংযোজন দেখুন। ভেবেছিলেন আপনি সবেমাত্র মানটি চেয়েছেন। মাই চুপা।
ডব্লিউজেএস

আমি আপনার নতুন কোড - ম্যাপ.এন্ট্রি ("0", "0000-00-00") - এর সাথে একটি ত্রুটি পেয়েছি - এটিতে বলা হয় যে মেথড ম্যাপ.এন্ট্রি মানচিত্র টাইপের জন্য অপরিজ্ঞাত ..
গ্রোভি শিখুন

আপনি অবশ্যই জাভা 9 এর চেয়ে পুরানো কিছু চালিয়ে যাচ্ছেন (এটি তখন যুক্ত করা হয়েছিল)। আমি একটি বিকল্প প্রস্তাব এবং এটি ব্যাখ্যা করব।
ডব্লিউজেএস

হ্যাঁ আমি জাভা 8 ব্যবহার করছি
গ্রোভি শিখুন

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


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 দেখাও)।
ওলে ভিভি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.