হাশম্যাপ থেকে কোনও উপাদানকে তার অবস্থান অনুসারে কীভাবে পুনরুদ্ধার করা যায়, এটি কি আদৌ সম্ভব?
হাশম্যাপ থেকে কোনও উপাদানকে তার অবস্থান অনুসারে কীভাবে পুনরুদ্ধার করা যায়, এটি কি আদৌ সম্ভব?
উত্তর:
হ্যাশম্যাপগুলি ক্রম সংরক্ষণ করে না:
এই শ্রেণিটি মানচিত্রের ক্রম হিসাবে কোনও গ্যারান্টি দেয় না; বিশেষত, এটি গ্যারান্টি দেয় না যে সময়ের সাথে ক্রম স্থির থাকবে।
কটাক্ষপাত LinkedHashMap , যা একটি আন্দাজের পুনরাবৃত্তির অর্ডার গ্যারান্টী বা নিশ্চয়তা দিচ্ছে।
একটি লিংকডহ্যাশম্যাপ ব্যবহার করুন এবং যখন আপনাকে অবস্থান অনুসারে পুনরুদ্ধার করতে হবে তখন মানগুলি একটি অ্যারেলিস্টে রূপান্তর করুন।
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);
আপনি মানচিত্রে যে উপাদানগুলিকে যুক্ত করেছেন সেটিকে বজায় রাখতে চাইলে ন্যায়বিচারের LinkedHashMap
বিপরীতে ব্যবহার করুন HashMap
।
এখানে এমন একটি দৃষ্টিভঙ্গি দেওয়া হচ্ছে যা আপনাকে মানচিত্রে এর সূচী দ্বারা একটি মান পেতে অনুমতি দেবে:
public Object getElementByIndex(LinkedHashMap map,int index){
return map.get( (map.keySet().toArray())[ index ] );
}
যদি আপনাকে কোনও কারণে হ্যাশম্যাপের সাথে লেগে থাকতে হয়, আপনি কীসেটকে একটি অ্যারেতে রূপান্তর করতে পারেন এবং মানচিত্রে মানগুলি পেতে অ্যারের কীগুলি সূচক করতে পারেন:
Object[] keys = map.keySet().toArray();
তারপরে আপনি মানচিত্রটি অ্যাক্সেস করতে পারবেন:
map.get(keys[i]);
String myKey = keys[i].toString();
ব্যবহার LinkedHashMap
:
পূর্বাভাসযোগ্য পুনরাবৃত্তির ক্রম সহ হ্যাশ টেবিল এবং মানচিত্র ইন্টারফেসের লিঙ্কযুক্ত তালিকার প্রয়োগ। এই প্রয়োগটি হ্যাশম্যাপ থেকে পৃথক হয়েছে কারণ এটি তার সমস্ত এন্ট্রি দিয়ে দ্বিগুণ-লিঙ্কযুক্ত তালিকা বজায় রাখে।
লিংকডহ্যাশম্যাপ ব্যবহার করুন এবং এই ফাংশনটি ব্যবহার করুন।
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;
}
ফাংশনটি নির্বাচিত এন্ট্রিটি ফিরিয়ে দিতে পারে।
আমি 'পজিশন' ধরে ধরে নিচ্ছি আপনি হ্যাশম্যাপে উপাদানগুলি orderোকিয়েছেন এমন ক্রমের দিকে আপনি উল্লেখ করছেন। সেক্ষেত্রে আপনি একটি লিঙ্কডহ্যাশম্যাপ ব্যবহার করতে চান। লিংকডহ্যাশম্যাপ তবে কোনও অ্যাকসেসর পদ্ধতি সরবরাহ করে না; আপনার মত একটি লিখতে হবে
public Object getElementAt(LinkedHashMap map, int index) {
for (Map.Entry entry : map.entrySet()) {
if (index-- == 0) {
return entry.value();
}
}
return null;
}
আর একটি কার্যকরী পদ্ধতির মানচিত্রের মানগুলিকে একটি অ্যারে রূপান্তর করা এবং তারপরে সূচিতে উপাদান পুনরুদ্ধার করা। নিম্নলিখিত পদ্ধতির সাহায্যে 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
লিঙ্কডহ্যাশম্যাপ থেকে সূচক অনুসারে সমস্ত উপাদান পুনরুদ্ধার করা বেশ ভারী অপারেশন বলে মনে হচ্ছে।
হ্যাশম্যাপ - এবং অন্তর্নিহিত ডেটা স্ট্রাকচার - হ্যাশ টেবিলগুলির অবস্থানের ধারণা নেই। লিংকডলিস্ট বা ভেক্টরের বিপরীতে, ইনপুট কীটি একটি 'বালতি'তে রূপান্তরিত হয় যেখানে মান সঞ্চিত থাকে। এই বালতিগুলি এমনভাবে অর্ডার করা হয়নি যা হ্যাশম্যাপ ইন্টারফেসের বাইরে অর্থবোধ করে এবং যেমন আপনি হ্যাশম্যাপে রেখেছেন এমন আইটেমগুলি সেই অর্থে নয় যে আপনি অন্যান্য ডেটা কাঠামোর সাথে প্রত্যাশা করবেন
ডিফল্টরূপে, জাভা লিংকডহ্যাসম্যাপ অবস্থান অনুসারে মান পাওয়ার জন্য সমর্থন করে না। সুতরাং আমি প্রস্তাবিত কাস্টমাইজড সঙ্গে যেতে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);
হ্যাশম্যাপগুলি পজিশনে অ্যাক্সেসের অনুমতি দেয় না, এটি কেবল হ্যাশ কোড সম্পর্কে জানে এবং এটি যদি কীটির হ্যাশ কোড গণনা করতে পারে তবে মানটি পুনরুদ্ধার করতে পারে। ট্রি ম্যাপগুলিতে অর্ডার দেওয়ার ধারণা রয়েছে। লিঙ্কডেস মানচিত্র তারা মানচিত্রে ক্রম সংরক্ষণ করে।
আপনি এরকম কিছু বাস্তবায়নের চেষ্টা করতে পারেন, দেখুন:
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
আমি আশা করি এটি আপনার পক্ষে কাজ করে।