এটির অবস্থানের দ্বারা কি হ্যাশম্যাপ থেকে উপাদান পাওয়া সম্ভব?


101

হাশম্যাপ থেকে কোনও উপাদানকে তার অবস্থান অনুসারে কীভাবে পুনরুদ্ধার করা যায়, এটি কি আদৌ সম্ভব?


11
"অবস্থান" বলতে কী বোঝ? হ্যাশম্যাপগুলি অর্ডার করা হয় না, সুতরাং তাদের "অবস্থান" সম্পর্কে সাধারণ ধারণা নেই যা আপনি কোনও ভেক্টরের মতো কিছু পেতে পারেন।
মাদুর

4
আপনি কি এর সন্নিবেশ অর্ডার বা অন্য কোনও অর্ডার দিয়ে বোঝাতে চান?
মার্ক এলিয়ট

উত্তর:


94

হ্যাশম্যাপগুলি ক্রম সংরক্ষণ করে না:

এই শ্রেণিটি মানচিত্রের ক্রম হিসাবে কোনও গ্যারান্টি দেয় না; বিশেষত, এটি গ্যারান্টি দেয় না যে সময়ের সাথে ক্রম স্থির থাকবে।

কটাক্ষপাত LinkedHashMap , যা একটি আন্দাজের পুনরাবৃত্তির অর্ডার গ্যারান্টী বা নিশ্চয়তা দিচ্ছে।


17
এটি আসলে প্রশ্নের উত্তর দেয় না। নীচের অন্যান্য উত্তরগুলি আরও কার্যকর।
forresthopkinsa

6
শ্রদ্ধার সাথে, এই ডকুমেন্টেশনগুলি উদ্ধৃত করে যা প্রশ্নের সরাসরি উত্তর দেয়
ওয়েইন

4
সময়ের সাথে সাথে যদি অর্ডার স্থির না হয়, তবুও কোনও নির্দিষ্ট অবস্থানের দ্বারা সদস্যদের একজনকে উদ্ধার করা সম্ভব হতে পারে।
শিক্ষানবিশ

আমি অনুসরণ করি না ব্যাখ্যা করা?
ওয়েইন

হ্যাশম্যাপ লিঙ্কটি ভাঙ্গা / 404।
রাফ

113

একটি লিংকডহ্যাশম্যাপ ব্যবহার করুন এবং যখন আপনাকে অবস্থান অনুসারে পুনরুদ্ধার করতে হবে তখন মানগুলি একটি অ্যারেলিস্টে রূপান্তর করুন।

LinkedHashMap<String,String> linkedHashMap = new LinkedHashMap<String,String>();
/* Populate */
linkedHashMap.put("key0","value0");
linkedHashMap.put("key1","value1");
linkedHashMap.put("key2","value2");
/* Get by position */
int pos = 1;
String value = (new ArrayList<String>(linkedHashMap.values())).get(pos);

4
হ্যাশম্যাপ থেকে কীগুলির অনুলিপিটি ইনস্ট্যান্ট করার জন্য সর্বদা প্রয়োজন ??
রিচার্ড

এটি প্রতিবার আমরা মূল্য পুনরুদ্ধার করে একটি নতুন অ্যারেলিস্ট অবজেক্ট তৈরি করবে, যা মেমরি ফাঁসের দিকে পরিচালিত করবে
নুলবাইট ০৮

49

আপনি মানচিত্রে যে উপাদানগুলিকে যুক্ত করেছেন সেটিকে বজায় রাখতে চাইলে ন্যায়বিচারের LinkedHashMapবিপরীতে ব্যবহার করুন HashMap

এখানে এমন একটি দৃষ্টিভঙ্গি দেওয়া হচ্ছে যা আপনাকে মানচিত্রে এর সূচী দ্বারা একটি মান পেতে অনুমতি দেবে:

public Object getElementByIndex(LinkedHashMap map,int index){
    return map.get( (map.keySet().toArray())[ index ] );
}

4
সহজতম আমি অবশ্যই বলতে চাই ... প্রতিটি জিনিস রূপান্তর করার পরিবর্তে আপনি কেবল কীসেট ব্যবহার করছেন। চমত্কার
কীর্তন 403

20

যদি আপনাকে কোনও কারণে হ্যাশম্যাপের সাথে লেগে থাকতে হয়, আপনি কীসেটকে একটি অ্যারেতে রূপান্তর করতে পারেন এবং মানচিত্রে মানগুলি পেতে অ্যারের কীগুলি সূচক করতে পারেন:

Object[] keys = map.keySet().toArray();

তারপরে আপনি মানচিত্রটি অ্যাক্সেস করতে পারবেন:

map.get(keys[i]);

দ্রষ্টব্য যে আর্ট [i] এ পরিবর্তিত হওয়া উচিত: কীগুলি [i]
মহেসেন আবাসি

ঠিক আছে, আমার কাছে মানচিত্র কী হিসাবে স্ট্রিং রয়েছে, সেগুলির একটি পেতে দ্বিতীয় String myKey = keys[i].toString();
ভাগটি

12

ব্যবহার LinkedHashMap:

পূর্বাভাসযোগ্য পুনরাবৃত্তির ক্রম সহ হ্যাশ টেবিল এবং মানচিত্র ইন্টারফেসের লিঙ্কযুক্ত তালিকার প্রয়োগ। এই প্রয়োগটি হ্যাশম্যাপ থেকে পৃথক হয়েছে কারণ এটি তার সমস্ত এন্ট্রি দিয়ে দ্বিগুণ-লিঙ্কযুক্ত তালিকা বজায় রাখে।


27
এটি অর্ডার সংরক্ষণ করবে, তবে আপনি এখনও তাদের সূচক অনুসারে আইটেম অ্যাক্সেস করতে পারবেন না। আপনাকে পুনরাবৃত্তি করতে হবে
বোজহো

এই লিঙ্কটি এপিআই এর একটি পুরানো সংস্করণ। আমি একটি জাভা 6 বা 7 এপিআইয়ের সাথে লিঙ্ক করার পরামর্শ দেব।
জেজেড

6

লিংকডহ্যাশম্যাপ ব্যবহার করুন এবং এই ফাংশনটি ব্যবহার করুন।

private LinkedHashMap<Integer, String> map = new LinkedHashMap<Integer, String>();

এটির মতো সংজ্ঞা দিন।

private Entry getEntry(int id){
        Iterator iterator = map.entrySet().iterator();
        int n = 0;
        while(iterator.hasNext()){
            Entry entry = (Entry) iterator.next();
            if(n == id){
                return entry;
            }
            n ++;
        }
        return null;
    }

ফাংশনটি নির্বাচিত এন্ট্রিটি ফিরিয়ে দিতে পারে।


3

আমি 'পজিশন' ধরে ধরে নিচ্ছি আপনি হ্যাশম্যাপে উপাদানগুলি orderোকিয়েছেন এমন ক্রমের দিকে আপনি উল্লেখ করছেন। সেক্ষেত্রে আপনি একটি লিঙ্কডহ্যাশম্যাপ ব্যবহার করতে চান। লিংকডহ্যাশম্যাপ তবে কোনও অ্যাকসেসর পদ্ধতি সরবরাহ করে না; আপনার মত একটি লিখতে হবে

public Object getElementAt(LinkedHashMap map, int index) {
    for (Map.Entry entry : map.entrySet()) {
        if (index-- == 0) {
            return entry.value();
        }
    }
    return null;
}

3

আর একটি কার্যকরী পদ্ধতির মানচিত্রের মানগুলিকে একটি অ্যারে রূপান্তর করা এবং তারপরে সূচিতে উপাদান পুনরুদ্ধার করা। নিম্নলিখিত পদ্ধতির সাহায্যে 100,000 অবজেক্টের লিঙ্কডহ্যাশম্যাপে সূচী অনুসন্ধানের মাধ্যমে 100 000 উপাদানটির পরীক্ষা করা নিম্নলিখিত ফলাফলগুলির দিকে পরিচালিত করে:

//My answer:
public Particle getElementByIndex(LinkedHashMap<Point, Particle> map,int index){
    return map.values().toArray(new Particle[map.values().size()])[index];
} //68 965 ms

//Syd Lambert's answer:
public Particle getElementByIndex(LinkedHashMap<Point, Particle> map,int index){
    return map.get( (map.keySet().toArray())[ index ] );
} //80 700 ms

লিঙ্কডহ্যাশম্যাপ থেকে সূচক অনুসারে সমস্ত উপাদান পুনরুদ্ধার করা বেশ ভারী অপারেশন বলে মনে হচ্ছে।


2

হ্যাশম্যাপ - এবং অন্তর্নিহিত ডেটা স্ট্রাকচার - হ্যাশ টেবিলগুলির অবস্থানের ধারণা নেই। লিংকডলিস্ট বা ভেক্টরের বিপরীতে, ইনপুট কীটি একটি 'বালতি'তে রূপান্তরিত হয় যেখানে মান সঞ্চিত থাকে। এই বালতিগুলি এমনভাবে অর্ডার করা হয়নি যা হ্যাশম্যাপ ইন্টারফেসের বাইরে অর্থবোধ করে এবং যেমন আপনি হ্যাশম্যাপে রেখেছেন এমন আইটেমগুলি সেই অর্থে নয় যে আপনি অন্যান্য ডেটা কাঠামোর সাথে প্রত্যাশা করবেন


2

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


2

আপনি কী পেতে কোডের নীচে ব্যবহার করতে পারেন: String [] keys = (String[]) item.keySet().toArray(new String[0]);

এবং এই আইটেমটির কী সহ হ্যাশম্যাপে প্রবেশ করা অবজেক্ট বা তালিকা পান: item.get(keys[position]);


2

ডিফল্টরূপে, জাভা লিংকডহ্যাসম্যাপ অবস্থান অনুসারে মান পাওয়ার জন্য সমর্থন করে না। সুতরাং আমি প্রস্তাবিত কাস্টমাইজড সঙ্গে যেতেIndexedLinkedHashMap

public class IndexedLinkedHashMap<K, V> extends LinkedHashMap<K, V> {

    private ArrayList<K> keysList = new ArrayList<>();

    public void add(K key, V val) {
        super.put(key, val);
        keysList.add(key);
    }

    public void update(K key, V val) {
        super.put(key, val);
    }

    public void removeItemByKey(K key) {
        super.remove(key);
        keysList.remove(key);
    }

    public void removeItemByIndex(int index) {
        super.remove(keysList.get(index));
        keysList.remove(index);
    }

    public V getItemByIndex(int i) {
        return (V) super.get(keysList.get(i));
    }

    public int getIndexByKey(K key) {
        return keysList.indexOf(key);
    }
}

তারপরে আপনি এই স্বনির্ধারিত লিংকডহ্যাসম্যাপটি ব্যবহার করতে পারেন

IndexedLinkedHashMap<String,UserModel> indexedLinkedHashMap=new IndexedLinkedHashMap<>();

মান যুক্ত করতে

indexedLinkedHashMap.add("key1",UserModel);

সূচক দ্বারা ভ্যালু পেতে

indexedLinkedHashMap.getItemByIndex(position);

1

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


0

আপনি এরকম কিছু বাস্তবায়নের চেষ্টা করতে পারেন, দেখুন:

Map<String, Integer> map = new LinkedHashMap<String, Integer>();
map.put("juan", 2);
map.put("pedro", 3);
map.put("pablo", 5);
map.put("iphoncio",9)

List<String> indexes = new ArrayList<String>(map.keySet()); // <== Parse

System.out.println(indexes.indexOf("juan"));     // ==> 0
System.out.println(indexes.indexOf("iphoncio"));      // ==> 3

আমি আশা করি এটি আপনার পক্ষে কাজ করে।

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