হাশম্যাপ কী হিসাবে কেস সংবেদনশীল স্ট্রিং


178

নিম্নলিখিত কারণে আমি হ্যাশম্যাপ কী হিসাবে কেস সংবেদনশীল স্ট্রিংটি ব্যবহার করতে চাই।

  • আরম্ভের সময়, আমার প্রোগ্রামটি ব্যবহারকারী সংজ্ঞায়িত স্ট্রিং সহ হ্যাশম্যাপ তৈরি করে
  • একটি ইভেন্ট প্রক্রিয়া করার সময় (আমার ক্ষেত্রে নেটওয়ার্ক ট্র্যাফিক), আমি অন্য কোনও ক্ষেত্রে স্ট্রিং পেয়েছি তবে আমার এটি সনাক্ত করতে সক্ষম হওয়া উচিত <key, value> ট্র্যাফিকের কাছ থেকে আমি যে মামলাটি পেয়েছি তা উপেক্ষা করে আমার হ্যাশম্যাপ থেকে ।

আমি এই পদ্ধতির অনুসরণ করেছি

CaseInsensitiveString.java

    public final class CaseInsensitiveString {
            private String s;

            public CaseInsensitiveString(String s) {
                            if (s == null)
                            throw new NullPointerException();
                            this.s = s;
            }

            public boolean equals(Object o) {
                            return o instanceof CaseInsensitiveString &&
                            ((CaseInsensitiveString)o).s.equalsIgnoreCase(s);
            }

            private volatile int hashCode = 0;

            public int hashCode() {
                            if (hashCode == 0)
                            hashCode = s.toUpperCase().hashCode();

                            return hashCode;
            }

            public String toString() {
                            return s;
            }
    }

LookupCode.java

    node = nodeMap.get(new CaseInsensitiveString(stringFromEvent.toString()));

এ কারণে, আমি প্রতিটি ইভেন্টের জন্য কেসআইসেনসেটিভ স্ট্রিংয়ের একটি নতুন অবজেক্ট তৈরি করছি। সুতরাং, এটি কর্মক্ষমতা হিট হতে পারে।

এই সমস্যা সমাধানের অন্য কোনও উপায় আছে কি?


3
[মানচিত্রের <স্ট্রিং,?> পাওয়া এবং উপেক্ষা করা মামলা রাখার কি কোনও ভাল উপায় আছে?] [1] [1]: স্ট্যাকওভারফ্লো.com
বিউ গ্রান্থাম

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

এটি ভাল কাজ করা উচিত। নতুন অবজেক্ট ইনস্ট্যান্টেশন থেকে মুক্তি পেতে আপনি ফ্লাইওয়েট ব্যবহার করতে পারেন।
টপকারা

উত্তর:


331
Map<String, String> nodeMap = 
    new TreeMap<>(String.CASE_INSENSITIVE_ORDER);

এটাই আপনার দরকার।


6
এটি এখন পর্যন্ত সবচেয়ে সহজ এবং কীগুলির মাধ্যমে পুনরাবৃত্তি করার সময় কীগুলির ক্ষেত্রে সংরক্ষণও করে।
রাল্ফ

এটা সুন্দর! এটি হ'ল কোল্ডফিউজেনে একটি অর্ডারযুক্ত কাঠামো তৈরির ধাঁধাটির চূড়ান্ত অংশ যা ডট নোটেশন ব্যবহারের ক্ষমতা রক্ষা করে। ভেরি স্ট্রাক্ট = {var বা ভেরি স্ট্রাক্ট = স্ট্রাকনিউ () এর পরিবর্তে আপনি var স্ট্রাক্ট = createObject ('java', 'java.util.TreeMap') ব্যবহার করতে পারেন। ) .CASE_INSENSITIVE_ORDER); FUGLY, তবে এটি কাজ করে;)
এরিক ফুলার

public static <K extends String, V> Map<K, V> caseInsensitiveMap() { return new TreeMap<K, V>(String.CASE_INSENSITIVE_ORDER); }
প্লী

5
চূড়ান্ত <K extends String>হওয়ার পরে কোনও প্রয়োজন নেই String: public static <V> Map<String, V> caseInsensitiveMap() { return new TreeMap<String, V>(String.CASE_INSENSITIVE_ORDER); }
রোল স্পিলকার

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

57

যেমন এখানে তাদের উত্তরে গাইডো গার্সিয়া পরামর্শ দিয়েছেন :

import java.util.HashMap;

public class CaseInsensitiveMap extends HashMap<String, String> {

    @Override
    public String put(String key, String value) {
       return super.put(key.toLowerCase(), value);
    }

    // not @Override because that would require the key parameter to be of type Object
    public String get(String key) {
       return super.get(key.toLowerCase());
    }
}

অথবা

https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/map/CaseInsensitiveMap.html


28
কীভাবে রয়েছে, পুটএল ইত্যাদি?
Assylias

14
এটি তুর্কি জাতীয় কিছু ভাষায় কাজ করে না। গুগল "টার্কি পরীক্ষা"
হুগো

5
@ এ্যাসিয়ালিয়াস: সত্য, containsKey()এবং remove()একই ফ্যাশনে ওভাররাইড করা উচিত get()HashMap.putAll()বাস্তবায়ন ব্যবহারসমূহ put()যতদিন HashMap বাস্তবায়ন থাকার বিষয়টি মতেই একই হিসাবে - যাতে কোন সমস্যা থাকা উচিত। ;) এছাড়াও get()পদ্ধতি স্বাক্ষরটি Objectআর্গুমেন্ট হিসাবে গ্রহণ করে, একটি নয় String। কোডটি নাল কীটির জন্যও পরীক্ষা করে না:super.get(key == null ? null : key.toString().toLowercase());
এফফেরা

নোট করুন যে আপনার যদি অনুলিপি-নির্মাণকারী প্রয়োজন হয় HashMap(<? extends String, ? extends String> anotherMap)তবে আপনার একই নির্মাণকারীর সুপার বাস্তবায়ন কল করা উচিত নয় কারণ এই অপারেশনটি আপনার কীগুলি নিম্নতর হয় তা গ্যারান্টি দেয় না। আপনি ব্যবহার করতে পারেন: super(anotherMap.size()); putAll(anotherMap);পরিবর্তে।
sfera

আপনি যদি মানচিত্রের মানগুলি নন-স্ট্রিং হিসাবে চান? (অর্থাত্ CaseInsensitiveMap<String, Integer>)
আদম পার্কিন

16

একটি পদ্ধতি হ'ল অ্যাপাচি কমন্স AbstractHashedMapক্লাসের একটি কাস্টম সাবক্লাস তৈরি করা , কেসগুলির সংবেদনশীল হ্যাশিং এবং কীগুলির তুলনা সম্পাদন করার পদ্ধতিগুলি hashএবং isEqualKeysপদ্ধতিগুলিকে ওভাররাইড করা । (দ্রষ্টব্য - আমি নিজেই এটি চেষ্টা করিনি ...)

প্রতিবার যখন আপনাকে কোনও মানচিত্রের অনুসন্ধান বা আপডেট করার দরকার হয় তখন এটি নতুন অবজেক্ট তৈরি করার ওভারহেড এড়ানো হয়। এবং সাধারণ Mapক্রিয়াকলাপগুলিকে ও (1) করা উচিত ... ঠিক নিয়মিতর মতো HashMap

এবং যদি আপনি তাদের দ্বারা কার্যকর করা পছন্দগুলি গ্রহণ করতে প্রস্তুত হন তবে অ্যাপাচি কমন্স CaseInsensitiveMapআপনার জন্য কাস্টমাইজ / বিশেষজ্ঞ AbstractHashedMapকরার কাজ করে।


তবে যদি ও (লগএন) getএবং putঅপারেশনগুলি গ্রহণযোগ্য TreeMapহয় তবে একটি কেস সংবেদনশীল স্ট্রিং তুলক সহ একটি বিকল্প; যেমন ব্যবহার String.CASE_INSENSITIVE_ORDER

এবং আপনি যদি প্রতিবার একটি putবা অস্থায়ী স্ট্রিং অবজেক্ট তৈরি করতে আপত্তি করেন না get, তবে বিশাল উত্তর ঠিক আছে's (যদিও, আমি লক্ষ করেছি যে আপনি কীগুলি করলে মূল কীগুলি সংরক্ষণ করা হবে না ...)


6

সাবক্লাস HashMapএবং এমন একটি সংস্করণ তৈরি করুন যা কী putএবং get(এবং সম্ভবত অন্যান্য মূল-ভিত্তিক পদ্ধতিগুলি) কে নিম্ন-ক্ষেত্রে করে ।

অথবা একটি HashMapনতুন ক্লাসে একটি মিশ্রণ করুন এবং মানচিত্রে সমস্ত কিছু হস্তান্তর করুন, তবে কীগুলি অনুবাদ করুন।

আপনার যদি মূল কীটি রাখতে হয় তবে আপনি দ্বৈত মানচিত্র বজায় রাখতে পারেন বা মূল কীটি সহ মানটি সংরক্ষণ করতে পারেন।


আপনি কি স্ট্রিং.টোলওয়ারকেস () দেখার সময় বলছেন?
টাকা

@ user710178 কেবল দেখার সময় নয় , পাশাপাশি সঞ্চয়স্থানের সময়।
ডেভ নিউটন

@ ব্যবহারকারী710178 ওহ, ঠিক আছে, অন্য উত্তরগুলি উল্লেখ করেছে যে আপনি যদি কোনও অতিরিক্ত নির্ভরতা বিবেচনা না করেন তবে এটি ইতিমধ্যে বিদ্যমান।
ডেভ নিউটন

@ স্টেফেনসি এটি যদি আপনার চাহিদা পূরণ করে তবে অবশ্যই; ওপি একটি নির্দিষ্ট করেছে HashMap, তাই আমি যা করেছি তার সাথে :) ওহ, আপনি কমন্সকে বোঝাচ্ছেন; আমি দেখি. আমার ধারণা, যতক্ষণ না আপনার জেনারেট করার প্রয়োজন নেই (বা তাদের কি এখন জেনেরিকস আছে?)
ডেভ নিউটন

1
জেডিকে ৮ এবং তদূর্ধ্বের জন্য আপনার বাস্তবায়ন পরিবর্তন হওয়ার সাথে সাথে (কমপক্ষে) পুটআলকে ওভাররাইড করতে হবে।
স্টিভ এন

4

দুটি পছন্দ আমার মনে আসে:

  1. আপনি সরাসরি s.toUpperCase().hashCode();কী হিসাবে ব্যবহার করতে পারেন Map
  2. আপনি কেসটিকে উপেক্ষা করে এমন TreeMap<String>একটি কাস্টম ব্যবহার করতে পারেন Comparator

অন্যথায়, আপনি যদি নিজের সমাধানটিকে পছন্দ করেন তবে নতুন ধরণের স্ট্রিং সংজ্ঞায়িত না করে আমি প্রয়োজনীয় ক্ষেত্রে সংবেদনশীলতার কার্যকারিতা সহ একটি নতুন মানচিত্রটি প্রয়োগ করব।


3

হ্যাশকোড মুখস্থ করার জন্য স্ট্রিংটিকে "মোড়ানো" ভাল কি না? স্ট্রিং ক্লাসে হ্যাশকোড () প্রথমবার ও (এন) হয় এবং তারপরে এটি ও (1) হয় যেহেতু এটি ভবিষ্যতের ব্যবহারের জন্য রাখা হয়।

public class HashWrap {
    private final String value;
    private final int hash;

    public String get() {
        return value;
    }

    public HashWrap(String value) {
        this.value = value;
        String lc = value.toLowerCase();
        this.hash = lc.hashCode();
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o instanceof HashWrap) {
            HashWrap that = (HashWrap) o;
            return value.equalsIgnoreCase(that.value);
        } else {
            return false;
        }
    }

    @Override
    public int hashCode() {
        return this.hash;
    }

    //might want to implement compare too if you want to use with SortedMaps/Sets.
}

এটি আপনাকে জাভাতে হ্যাশটেবলের যে কোনও বাস্তবায়ন ব্যবহার করতে এবং ও (1) হ্যাডকোড () রাখার অনুমতি দেয়।


3

আপনি একলিপস সংগ্রহ থেকে ভিত্তি করে একটি হ্যাশিংস্ট্রজি ব্যবহার করতে পারেনMap

HashingStrategy<String> hashingStrategy =
    HashingStrategies.fromFunction(String::toUpperCase);
MutableMap<String, String> node = HashingStrategyMaps.mutable.of(hashingStrategy);

দ্রষ্টব্য: আমি গ্রহন গ্রাহক সংগ্রহের একজন সহযোগী।


2

অন্যান্য উত্তরের উপর ভিত্তি করে মূলত দুটি পন্থা রয়েছে: সাবক্ল্যাসিং HashMapবা মোড়ানো String। প্রথমটির জন্য আরও কিছু কাজ প্রয়োজন। আসলে, আপনি যদি এটি সঠিকভাবে করতে চান তবে আপনাকে অবশ্যই প্রায় সমস্ত পদ্ধতি ( containsKey, entrySet, get, put, putAll and remove) র ওভাররাইড করতে হবে ।

যাইহোক, এটি একটি সমস্যা আছে। আপনি ভবিষ্যতে সমস্যা এড়ানোর জন্য চান, আপনি একটি নির্দিষ্ট করতে হবে LocaleStringক্ষেত্রে অপারেশন। সুতরাং আপনি নতুন পদ্ধতি তৈরি করবেন ( get(String, Locale), ...)। স্ট্রিং: সবকিছুই সহজ এবং পরিষ্কার মোড়ানো is

public final class CaseInsensitiveString {

    private final String s;

    public CaseInsensitiveString(String s, Locale locale) {
        this.s = s.toUpperCase(locale);
    }

    // equals, hashCode & toString, no need for memoizing hashCode
}

এবং ভাল, কর্মক্ষমতা সম্পর্কে আপনার উদ্বেগ সম্পর্কে: অকালীন অপ্টিমাইজেশন হ'ল সমস্ত অশুভের মূল :)


2
"এবং ভাল, কর্মক্ষমতা সম্পর্কে আপনার উদ্বেগ সম্পর্কে: অকালীন অপ্টিমাইজেশন হ'ল সমস্ত অশুভের মূল :)" - বিপরীতে, সর্বদা অদ্বিতীয় কোড লেখার অজুহাত হিসাবে ব্যবহার করা যা মন্দ তা।
গর্ডন

1
আসলে @ গর্ডন, উভয়ই সমানভাবে খারাপ, প্রসঙ্গে। "অশুভ" লেবেলটি "সেরা অনুশীলন" এবং বিভিন্ন আইটি-র লোক ব্যবহার করার ঝোঁকযুক্ত বিভিন্ন অপ্রয়োজনীয় বাক্যাংশের মতো কালো-সাদা চিন্তার একটি চিহ্ন। এটি পুরোপুরি এড়ানো সেরা।
স্টিফেন সি

আমি লোকদের বলছি তারা "সেরা অনুশীলন" অনুসরণ করছে না তাদের খারাপ অনুশীলন রয়েছে তা বলার চেয়ে কম খননকৃত ইন হিল উত্পাদন করার ঝোঁক রয়েছে।
গর্ডন

0

এটি হ্যাশম্যাপগুলির জন্য একটি অ্যাডাপ্টার যা আমি সাম্প্রতিক প্রকল্পের জন্য প্রয়োগ করেছি। @ স্যান্ডিআর যা করে তার সাথে মিলেমিশে কাজ করে তবে রূপান্তর যুক্তিকে এনপ্যাপুলেট করে যাতে আপনি ম্যানুয়ালি স্ট্রিংগুলিকে মোড়কের বস্তুতে রূপান্তর করতে পারেন না।

আমি জাভা 8 বৈশিষ্ট্যগুলি ব্যবহার করেছি তবে কয়েকটি পরিবর্তন সহ আপনি এটি পূর্ববর্তী সংস্করণগুলিতে মানিয়ে নিতে পারেন। আমি নতুন জাভা 8 স্ট্রিম ফাংশন বাদে বেশিরভাগ সাধারণ দৃশ্যের জন্য এটি পরীক্ষা করেছি।

মূলত এটি একটি হ্যাশম্যাপ মোড়ানো, একটি মোড়কের বস্তুতে / থেকে স্ট্রিংগুলিকে রূপান্তর করার সময় সমস্ত ফাংশনকে এটিতে নির্দেশ দেয়। তবে আমাকে কীসেট এবং এন্ট্রিসেটটিও মানিয়ে নিতে হয়েছিল কারণ তারা মানচিত্রটিতে কিছু ফাংশন ফরোয়ার্ড করে। সুতরাং আমি কী এবং এন্ট্রিগুলির জন্য দুটি নতুন সেট ফিরিয়ে দিচ্ছি যা মূল কীসেট () এবং এন্ট্রিসেট () প্রকৃতভাবে আবৃত করে।

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

কোডটি উন্নত করার জন্য যদি আপনি কোনও বাগ খুঁজে পান বা পরামর্শ পান তবে আমাকে জানান।

প্যাকেজ

import java.util.*;
import java.util.function.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;


public class CaseInsensitiveMapAdapter<T> implements Map<String,T>
{
    private Map<CaseInsensitiveMapKey,T> map;
    private KeySet keySet;
    private EntrySet entrySet;


    public CaseInsensitiveMapAdapter()
    {
    }

    public CaseInsensitiveMapAdapter(Map<String, T> map)
    {
        this.map = getMapImplementation();
        this.putAll(map);
    }

    @Override
    public int size()
    {
        return getMap().size();
    }

    @Override
    public boolean isEmpty()
    {
        return getMap().isEmpty();
    }

    @Override
    public boolean containsKey(Object key)
    {
        return getMap().containsKey(lookupKey(key));
    }

    @Override
    public boolean containsValue(Object value)
    {
        return getMap().containsValue(value);
    }

    @Override
    public T get(Object key)
    {
        return getMap().get(lookupKey(key));
    }

    @Override
    public T put(String key, T value)
    {
        return getMap().put(lookupKey(key), value);
    }

    @Override
    public T remove(Object key)
    {
        return getMap().remove(lookupKey(key));
    }

    /***
     * I completely ignore Java 8 implementation and put one by one.This will be slower.
     */
    @Override
    public void putAll(Map<? extends String, ? extends T> m)
    {
        for (String key : m.keySet()) {
            getMap().put(lookupKey(key),m.get(key));
        }
    }

    @Override
    public void clear()
    {
        getMap().clear();
    }

    @Override
    public Set<String> keySet()
    {
        if (keySet == null)
            keySet = new KeySet(getMap().keySet());
        return keySet;
    }

    @Override
    public Collection<T> values()
    {
        return getMap().values();
    }

    @Override
    public Set<Entry<String, T>> entrySet()
    {
        if (entrySet == null)
            entrySet = new EntrySet(getMap().entrySet());
        return entrySet;
    }

    @Override
    public boolean equals(Object o)
    {
        return getMap().equals(o);
    }

    @Override
    public int hashCode()
    {
        return getMap().hashCode();
    }

    @Override
    public T getOrDefault(Object key, T defaultValue)
    {
        return getMap().getOrDefault(lookupKey(key), defaultValue);
    }

    @Override
    public void forEach(final BiConsumer<? super String, ? super T> action)
    {
        getMap().forEach(new BiConsumer<CaseInsensitiveMapKey, T>()
        {
            @Override
            public void accept(CaseInsensitiveMapKey lookupKey, T t)
            {
                action.accept(lookupKey.key,t);
            }
        });
    }

    @Override
    public void replaceAll(final BiFunction<? super String, ? super T, ? extends T> function)
    {
        getMap().replaceAll(new BiFunction<CaseInsensitiveMapKey, T, T>()
        {
            @Override
            public T apply(CaseInsensitiveMapKey lookupKey, T t)
            {
                return function.apply(lookupKey.key,t);
            }
        });
    }

    @Override
    public T putIfAbsent(String key, T value)
    {
        return getMap().putIfAbsent(lookupKey(key), value);
    }

    @Override
    public boolean remove(Object key, Object value)
    {
        return getMap().remove(lookupKey(key), value);
    }

    @Override
    public boolean replace(String key, T oldValue, T newValue)
    {
        return getMap().replace(lookupKey(key), oldValue, newValue);
    }

    @Override
    public T replace(String key, T value)
    {
        return getMap().replace(lookupKey(key), value);
    }

    @Override
    public T computeIfAbsent(String key, final Function<? super String, ? extends T> mappingFunction)
    {
        return getMap().computeIfAbsent(lookupKey(key), new Function<CaseInsensitiveMapKey, T>()
        {
            @Override
            public T apply(CaseInsensitiveMapKey lookupKey)
            {
                return mappingFunction.apply(lookupKey.key);
            }
        });
    }

    @Override
    public T computeIfPresent(String key, final BiFunction<? super String, ? super T, ? extends T> remappingFunction)
    {
        return getMap().computeIfPresent(lookupKey(key), new BiFunction<CaseInsensitiveMapKey, T, T>()
        {
            @Override
            public T apply(CaseInsensitiveMapKey lookupKey, T t)
            {
                return remappingFunction.apply(lookupKey.key, t);
            }
        });
    }

    @Override
    public T compute(String key, final BiFunction<? super String, ? super T, ? extends T> remappingFunction)
    {
        return getMap().compute(lookupKey(key), new BiFunction<CaseInsensitiveMapKey, T, T>()
        {
            @Override
            public T apply(CaseInsensitiveMapKey lookupKey, T t)
            {
                return remappingFunction.apply(lookupKey.key,t);
            }
        });
    }

    @Override
    public T merge(String key, T value, BiFunction<? super T, ? super T, ? extends T> remappingFunction)
    {
        return getMap().merge(lookupKey(key), value, remappingFunction);
    }

    protected  Map<CaseInsensitiveMapKey,T> getMapImplementation() {
        return new HashMap<>();
    }

    private Map<CaseInsensitiveMapKey,T> getMap() {
        if (map == null)
            map = getMapImplementation();
        return map;
    }

    private CaseInsensitiveMapKey lookupKey(Object key)
    {
        return new CaseInsensitiveMapKey((String)key);
    }

    public class CaseInsensitiveMapKey {
        private String key;
        private String lookupKey;

        public CaseInsensitiveMapKey(String key)
        {
            this.key = key;
            this.lookupKey = key.toUpperCase();
        }

        @Override
        public boolean equals(Object o)
        {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;

            CaseInsensitiveMapKey that = (CaseInsensitiveMapKey) o;

            return lookupKey.equals(that.lookupKey);

        }

        @Override
        public int hashCode()
        {
            return lookupKey.hashCode();
        }
    }

    private class KeySet implements Set<String> {

        private Set<CaseInsensitiveMapKey> wrapped;

        public KeySet(Set<CaseInsensitiveMapKey> wrapped)
        {
            this.wrapped = wrapped;
        }


        private List<String> keyList() {
            return stream().collect(Collectors.toList());
        }

        private Collection<CaseInsensitiveMapKey> mapCollection(Collection<?> c) {
            return c.stream().map(it -> lookupKey(it)).collect(Collectors.toList());
        }

        @Override
        public int size()
        {
            return wrapped.size();
        }

        @Override
        public boolean isEmpty()
        {
            return wrapped.isEmpty();
        }

        @Override
        public boolean contains(Object o)
        {
            return wrapped.contains(lookupKey(o));
        }

        @Override
        public Iterator<String> iterator()
        {
            return keyList().iterator();
        }

        @Override
        public Object[] toArray()
        {
            return keyList().toArray();
        }

        @Override
        public <T> T[] toArray(T[] a)
        {
            return keyList().toArray(a);
        }

        @Override
        public boolean add(String s)
        {
            return wrapped.add(lookupKey(s));
        }

        @Override
        public boolean remove(Object o)
        {
            return wrapped.remove(lookupKey(o));
        }

        @Override
        public boolean containsAll(Collection<?> c)
        {
            return keyList().containsAll(c);
        }

        @Override
        public boolean addAll(Collection<? extends String> c)
        {
            return wrapped.addAll(mapCollection(c));
        }

        @Override
        public boolean retainAll(Collection<?> c)
        {
            return wrapped.retainAll(mapCollection(c));
        }

        @Override
        public boolean removeAll(Collection<?> c)
        {
            return wrapped.removeAll(mapCollection(c));
        }

        @Override
        public void clear()
        {
            wrapped.clear();
        }

        @Override
        public boolean equals(Object o)
        {
            return wrapped.equals(lookupKey(o));
        }

        @Override
        public int hashCode()
        {
            return wrapped.hashCode();
        }

        @Override
        public Spliterator<String> spliterator()
        {
            return keyList().spliterator();
        }

        @Override
        public boolean removeIf(Predicate<? super String> filter)
        {
            return wrapped.removeIf(new Predicate<CaseInsensitiveMapKey>()
            {
                @Override
                public boolean test(CaseInsensitiveMapKey lookupKey)
                {
                    return filter.test(lookupKey.key);
                }
            });
        }

        @Override
        public Stream<String> stream()
        {
            return wrapped.stream().map(it -> it.key);
        }

        @Override
        public Stream<String> parallelStream()
        {
            return wrapped.stream().map(it -> it.key).parallel();
        }

        @Override
        public void forEach(Consumer<? super String> action)
        {
            wrapped.forEach(new Consumer<CaseInsensitiveMapKey>()
            {
                @Override
                public void accept(CaseInsensitiveMapKey lookupKey)
                {
                    action.accept(lookupKey.key);
                }
            });
        }
    }

    private class EntrySet implements Set<Map.Entry<String,T>> {

        private Set<Entry<CaseInsensitiveMapKey,T>> wrapped;

        public EntrySet(Set<Entry<CaseInsensitiveMapKey,T>> wrapped)
        {
            this.wrapped = wrapped;
        }


        private List<Map.Entry<String,T>> keyList() {
            return stream().collect(Collectors.toList());
        }

        private Collection<Entry<CaseInsensitiveMapKey,T>> mapCollection(Collection<?> c) {
            return c.stream().map(it -> new CaseInsensitiveEntryAdapter((Entry<String,T>)it)).collect(Collectors.toList());
        }

        @Override
        public int size()
        {
            return wrapped.size();
        }

        @Override
        public boolean isEmpty()
        {
            return wrapped.isEmpty();
        }

        @Override
        public boolean contains(Object o)
        {
            return wrapped.contains(lookupKey(o));
        }

        @Override
        public Iterator<Map.Entry<String,T>> iterator()
        {
            return keyList().iterator();
        }

        @Override
        public Object[] toArray()
        {
            return keyList().toArray();
        }

        @Override
        public <T> T[] toArray(T[] a)
        {
            return keyList().toArray(a);
        }

        @Override
        public boolean add(Entry<String,T> s)
        {
            return wrapped.add(null );
        }

        @Override
        public boolean remove(Object o)
        {
            return wrapped.remove(lookupKey(o));
        }

        @Override
        public boolean containsAll(Collection<?> c)
        {
            return keyList().containsAll(c);
        }

        @Override
        public boolean addAll(Collection<? extends Entry<String,T>> c)
        {
            return wrapped.addAll(mapCollection(c));
        }

        @Override
        public boolean retainAll(Collection<?> c)
        {
            return wrapped.retainAll(mapCollection(c));
        }

        @Override
        public boolean removeAll(Collection<?> c)
        {
            return wrapped.removeAll(mapCollection(c));
        }

        @Override
        public void clear()
        {
            wrapped.clear();
        }

        @Override
        public boolean equals(Object o)
        {
            return wrapped.equals(lookupKey(o));
        }

        @Override
        public int hashCode()
        {
            return wrapped.hashCode();
        }

        @Override
        public Spliterator<Entry<String,T>> spliterator()
        {
            return keyList().spliterator();
        }

        @Override
        public boolean removeIf(Predicate<? super Entry<String, T>> filter)
        {
            return wrapped.removeIf(new Predicate<Entry<CaseInsensitiveMapKey, T>>()
            {
                @Override
                public boolean test(Entry<CaseInsensitiveMapKey, T> entry)
                {
                    return filter.test(new FromCaseInsensitiveEntryAdapter(entry));
                }
            });
        }

        @Override
        public Stream<Entry<String,T>> stream()
        {
            return wrapped.stream().map(it -> new Entry<String, T>()
            {
                @Override
                public String getKey()
                {
                    return it.getKey().key;
                }

                @Override
                public T getValue()
                {
                    return it.getValue();
                }

                @Override
                public T setValue(T value)
                {
                    return it.setValue(value);
                }
            });
        }

        @Override
        public Stream<Map.Entry<String,T>> parallelStream()
        {
            return StreamSupport.stream(spliterator(), true);
        }

        @Override
        public void forEach(Consumer<? super Entry<String, T>> action)
        {
            wrapped.forEach(new Consumer<Entry<CaseInsensitiveMapKey, T>>()
            {
                @Override
                public void accept(Entry<CaseInsensitiveMapKey, T> entry)
                {
                    action.accept(new FromCaseInsensitiveEntryAdapter(entry));
                }
            });
        }
    }

    private class EntryAdapter implements Map.Entry<String,T> {
        private Entry<String,T> wrapped;

        public EntryAdapter(Entry<String, T> wrapped)
        {
            this.wrapped = wrapped;
        }

        @Override
        public String getKey()
        {
            return wrapped.getKey();
        }

        @Override
        public T getValue()
        {
            return wrapped.getValue();
        }

        @Override
        public T setValue(T value)
        {
            return wrapped.setValue(value);
        }

        @Override
        public boolean equals(Object o)
        {
            return wrapped.equals(o);
        }

        @Override
        public int hashCode()
        {
            return wrapped.hashCode();
        }


    }

    private class CaseInsensitiveEntryAdapter implements Map.Entry<CaseInsensitiveMapKey,T> {

        private Entry<String,T> wrapped;

        public CaseInsensitiveEntryAdapter(Entry<String, T> wrapped)
        {
            this.wrapped = wrapped;
        }

        @Override
        public CaseInsensitiveMapKey getKey()
        {
            return lookupKey(wrapped.getKey());
        }

        @Override
        public T getValue()
        {
            return wrapped.getValue();
        }

        @Override
        public T setValue(T value)
        {
            return wrapped.setValue(value);
        }
    }

    private class FromCaseInsensitiveEntryAdapter implements Map.Entry<String,T> {

        private Entry<CaseInsensitiveMapKey,T> wrapped;

        public FromCaseInsensitiveEntryAdapter(Entry<CaseInsensitiveMapKey, T> wrapped)
        {
            this.wrapped = wrapped;
        }

        @Override
        public String getKey()
        {
            return wrapped.getKey().key;
        }

        @Override
        public T getValue()
        {
            return wrapped.getValue();
        }

        @Override
        public T setValue(T value)
        {
            return wrapped.setValue(value);
        }
    }


}

0

এ কারণে, আমি প্রতিটি ইভেন্টের জন্য কেসআইসেনসেটিভ স্ট্রিংয়ের একটি নতুন অবজেক্ট তৈরি করছি। সুতরাং, এটি কর্মক্ষমতা হিট হতে পারে।

দু'টি নতুন অবজেক্ট তৈরি করার আগে মোড়ক তৈরি করা বা কী কে লোয়ার কেসে রূপান্তর করা। আপনার নিজের java.util.Map বাস্তবায়ন লিখন এটিকে এড়ানোর একমাত্র উপায়। এটি খুব কঠিন নয়, এবং আইএমও এর পক্ষে মূল্যবান। আমি কয়েকশ টি কী পর্যন্ত বেশ ভালভাবে কাজ করতে নিম্নলিখিত হ্যাশ ফাংশনটি পেয়েছি।

static int ciHashCode(String string)
{
    // length and the low 5 bits of hashCode() are case insensitive
    return (string.hashCode() & 0x1f)*33 + string.length();
}

-3

জাভা 8 টি স্ট্রিম ব্যবহার সম্পর্কে কীভাবে।

nodeMap.entrySet().stream().filter(x->x.getKey().equalsIgnoreCase(stringfromEven.toString()).collect(Collectors.toList())

এটি আপনাকে মানচিত্রে সংবেদনশীল পদ্ধতিতে মানগুলি সন্ধান করতে সক্ষম করে না।
গিলি

ইক্যুয়ালসিনোরেসেস কি এমনটা করতে পারে না?
অমরেন্দ্র রেড্ডি

আপনি একটি তালিকা তৈরি করছেন। ওপি একটি মানচিত্র চেয়েছিল।
গিলি

এটি কোনও মানচিত্রের ও (1) জটিলতা সুবিধাটি ধ্বংস করে ys
পল রুনি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.