কেন এনামম্যাপ জাভাতে একটি সাজানো ম্যাপ নয়?


9

EnumMap<K extends Enum<K>, V> জাভাতে পরিষ্কারভাবে সম্পর্কিত এনামের সংজ্ঞা দিয়ে অর্ডার করা হয়েছে, আপনি জাভাডোকেও দেখতে পাচ্ছেন:

এনাম মানচিত্রগুলি তাদের কীগুলির প্রাকৃতিক ক্রমে বজায় রাখা হয় (এনম কনস্ট্যান্টগুলি যে ক্রম হিসাবে ঘোষণা করা হয়)। এই iterators সংগ্রহ মতামত দ্বারা ফিরে প্রতিফলিত হয় ( keySet(), entrySet(), এবং values())।

আমার যা দরকার তা হ'ল SortedMapকী টাইপ হিসাবে এনাম ব্যবহার করা। আমি এর মতো পদ্ধতি ব্যবহার করতে চাই headMap()বা চাই firstKey()তবে আমি যুক্ত হওয়া সিপিইউ + মেমরির কার্যকারিতা থেকে লাভ করতে চাই EnumMap। একটি TreeMapউপায় খুব ওভারহেড এখানে মত শোনায়।

প্রশ্ন : এই মাত্র বাস্তবায়ন মিস হয়েছিল, এটা (থেকে প্রাপ্ত আলস্য ছিল AbstractMap) অথবা কেন একটি ভাল কারণ নেই EnumMapএকটি নয় SortedMap?


ট্রিসেট সম্পর্কে কী?
মোহাম্মদ দেইফাল্লাহ

@ মোহাম্মদীদেফাল্লাহ এটি সম্পূর্ণ আলাদা, এর কোনও চাবি নেই ... আপনার মানে TreeMap?
দেহার

3
আমি এই সমস্যাটি ওপেনজেডকের জন্য সন্ধান করতে সক্ষম হয়েছি । এটি ২০০৫ সাল থেকে এখনও খোলা / অমীমাংসিত। আমি ধরে নেব যে এটি বাস্তবায়িত হওয়ার কোনও "ভাল কারণ" নেই।
বেনালেন

1
সত্যই দ্রুত উত্তরগুলির জন্য ধন্যবাদ, আমি যোগ করেছি যে আমি এখানে ট্রিম্যাপটি খুব বেশি ওভারহেড, এবং প্রশ্নের জন্য ও (লগ এন) খুঁজে পাই। তবে অবশ্যই আমার প্রশ্নটিও এনামসেট এবং সাজাডসেটের জন্য একই সমস্যা।
কাঁচা কোড

@ আমোনগালেন: আপনার উত্তরটি আমার প্রশ্নের উত্তর হিসাবে যোগ্যতা অর্জন করে, যদিও এটি মূল কারণটির উত্তর দেয় না, তাছাড়া "ওরাকল যত্নের সাথে ফগিং করে না" " এমনকি গুগল আপনার উল্লিখিত ওপেনজেডিকে সমস্যাটি খুঁজে পায় নি, তাই কমপক্ষে এটি অন্যদেরকে একই সমস্যাতে সহায়তা করবে।
কাঁচা কোড

উত্তর:


3

এটি আপনার প্রাথমিক প্রশ্নের কোনও উত্তর দেবে না (কারণ কেবলমাত্র মূল ডিজাইনারদেরই উত্তর রয়েছে), তবে আমি আপনাকে বিবেচনা করার জন্য একটি উপায় ছিল considering SortedMapভিত্তিক একটি বাস্তবায়ন করার চেষ্টা করার সময় EnumMap, আমি নিম্নলিখিত ক্লাসটি নিয়ে এসেছি।

এটি অবশ্যই একটি দ্রুত এবং নোংরা বাস্তবায়ন (এবং নোট করুন যে এটি সম্পূর্ণরূপে মেনে চলছে না SortedMap- কারণ দেখার প্রয়োজনীয়তাগুলি পূরণ করা হয় না) তবে আপনার যদি প্রয়োজন হয় তবে আপনি এটি উন্নত করতে পারেন:

class SortedEnumMap<K extends Enum<K>, V> 
    extends EnumMap<K, V> 
    implements SortedMap<K, V> {

    private Class<K> enumClass;
    private K[] values;

    public SortedEnumMap(Class<K> keyType) {
        super(keyType);
        this.values = keyType.getEnumConstants();
        this.enumClass = keyType;

        if (this.values.length == 0) {
            throw new IllegalArgumentException("Empty values");
        }
    }

    @Override
    public Comparator<? super K> comparator() {
        return Comparator.comparingInt(K::ordinal);
    }

    @Override
    public SortedMap<K, V> subMap(K fromKey, K toKey) {
        List<K> keys = Arrays.stream(this.values)
                .dropWhile(k -> k.ordinal() < fromKey.ordinal())
                .takeWhile(k -> k.ordinal() < toKey.ordinal())
                .collect(Collectors.toList());

        return this.forKeys(keys);
    }

    @Override
    public SortedMap<K, V> headMap(K toKey) {
        List<K> keys = new ArrayList<>();

        for (K k : this.values) {
            if (k.ordinal() < toKey.ordinal()) {
                keys.add(k);
            } else {
                break;
            }
        }

        return this.forKeys(keys);
    }

    @Override
    public SortedMap<K, V> tailMap(K fromKey) {
        List<K> keys = new ArrayList<>();

        for (K k : this.values) {
            if (k.ordinal() >= fromKey.ordinal()) {
                keys.add(k);
            }
        }

        return this.forKeys(keys);
    }

    //Returned map is NOT a "view" or the current one
    private SortedEnumMap<K, V> forKeys(List<K> keys) {
        SortedEnumMap<K, V> n = new SortedEnumMap<>(this.enumClass);
        keys.forEach(key -> n.put(key, super.get(key)));

        return n;
    }

    @Override
    public K firstKey() {
        return this.values[0];
    }

    @Override
    public K lastKey() {
        return this.values[this.values.length - 1];
    }
}

এবং দ্রুত পরীক্ষার জন্য (ত্রুটিগুলি এখনও খুঁজে পাওয়া যায়নি):

SortedMap<Month, Integer> m = new SortedEnumMap(Month.class);

for (Month v : Month.values()) {
    m.put(v, v.getValue());
}

System.out.println("firstKey():       " + m.firstKey());
System.out.println("lastKey():        " + m.lastKey());
System.out.println("headMap/June:     " + m.headMap(Month.JUNE));
System.out.println("tailMap/June:     " + m.tailMap(Month.JUNE));
System.out.println("subMap/April-July " + m.subMap(Month.APRIL, Month.JULY));

আমি পাই:

firstKey():       JANUARY
lastKey():        DECEMBER
headMap/June:     {JANUARY=1, FEBRUARY=2, MARCH=3, APRIL=4, MAY=5}
tailMap/June:     {JUNE=6, JULY=7, AUGUST=8, SEPTEMBER=9, OCTOBER=10, NOVEMBER=11, DECEMBER=12}
subMap/April-July {APRIL=4, MAY=5, JUNE=6}

1
আপনি মন্তব্য করেছেন যে "প্রত্যাবর্তিত মানচিত্রটি" দৃশ্য "বা বর্তমানের নয়", তবে এই পদ্ধতিগুলি (শিরোনাম / উপ / লেজু-মানচিত্র) অবশ্যই পুনরুদ্ধার মতামত।
Assylias

1
আমি যে আপনার উত্তর তন্ন তন্ন দেখতে সত্যিই আমার প্রাথমিক প্রশ্নের উত্তর কিন্তু তাই আমি আপনার প্রচেষ্টার জন্য আপনাকে ক্রেডিট দেব আপনার উত্তর, অন্তত খুব এই সমস্যার সঙ্গে অন্যান্য ব্যক্তিদের কাছে সহায়ক হবে। হতে পারে ওরাকলে থাকা কেউ এটিকে পড়বে এবং টেনে
আনবে

@ এ্যাসেলিয়াস এটি ঠিক, এবং আমি পোস্টে এর স্পষ্ট উল্লেখ করেছি
আর্নেস্ট_ কে

একটি বাছাই করা মানচিত্র যা লাইনারি অনুসন্ধানের মাধ্যমে সাজানো প্রকৃতি কাজে লাগানোর উদ্দেশ্যে এই সমস্ত ক্রিয়াকলাপ বাস্তবায়ন করে ...
হোলগার

3

ওপেন বৈশিষ্ট্য অনুরোধ

আমি খুঁজে পেতে সক্ষম ছিল এই সমস্যাটি জন্য OpenJDK । এটি ২০০৫ সাল থেকে এখনও খোলা / অমীমাংসিত।

আমি ধরে নেব যে এটি বাস্তবায়িত হওয়ার কোনও "ভাল কারণ" নেই।


এটি করার জন্য আপনাকে ধন্যবাদ. এরই মধ্যে আমি আর্নেস্ট_ কে এর উত্তর দেখেছি যা আমার প্রশ্নের আসলে উত্তর দেয় না, তবে আমার প্রশ্নের অন্তর্নিহিত সমস্যার সমাধানের জন্য একটি দুর্দান্ত সমাধান এনেছে। আমি দুঃখিত যে আমি প্রথমে উল্লিখিত হিসাবে আপনাকে ক্রেডিট দেয় নি, তবে আমার মনে হয় কাজের জন্য ernest_k এটি প্রাপ্য।
रॉচকোড 13

@ আরওকোড এটি সম্পূর্ণরূপে বোধগম্য। আমি যদি আপনি থাকতাম তবে আমি আর্নেস্ট_ক এর উত্তরটিও গ্রহণ করতাম - এটি আমার চেয়ে অনেক বেশি সহায়ক।
বেনালেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.