হ্যাশম্যাপ কীটির নামকরণ করা কি সম্ভব?


92

আমি একটি হাশম্যাপ কী নামকরণের জন্য একটি উপায় খুঁজছি, তবে জাভাতে এটি সম্ভব কিনা তা আমি জানি না।


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

4
দয়া করে একটি হ্যাশ প্রবেশের কীটি সংশোধন করবেন না! আপনি যদি ভাগ্যবান হন তবে আপনি এটি একই হ্যাশকোড দিয়ে কিছুতে পরিবর্তন করবেন এবং কী ঘটেছে তা বের করার চেষ্টা করতে আপনি কিছুটা ক্রেজি হয়ে যাবেন; যদি আপনি দুর্ভাগ্য হন, আপনি এমন একটি এন্ট্রি দিয়ে শেষ করতে পারেন যা পাওয়া যায় না (ভাল, পুরো টেবিলটির পরবর্তী পুনর্নির্মাণ না হওয়া পর্যন্ত)। সরান / পুনরায় সঞ্চার করা অনেক স্যানার, এবং এটি বেশ সস্তা হওয়া উচিত (এটি সর্বোপরি সমস্ত তথ্যসূত্র)।
ডোনাল ফেলো

উত্তর:


140

উপাদানটি মুছে ফেলার চেষ্টা করুন এবং নতুন নাম দিয়ে এটি আবার রাখুন। আপনার মানচিত্রের কীগুলি ধরে নিলে এটি Stringসেভাবে অর্জন করা যেতে পারে:

Object obj = map.remove("oldKey");
map.put("newKey", obj);

61
+1 এবং পড়ার জন্য সহজতম map.put( "newKey", map.remove( "oldKey" ) );এবং সরবরাহিত রয়েছেoldKey
রবীন্দ্র রেড্ডি

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

4
জাভ্যাক 1.8.0_45 এর জন্য, এক-লাইন সংস্করণটি দুটি বাইটোকড সংক্ষিপ্ত, যা আমাকে অবাক করেছিল। আরো annoyingly জেনেরিক্স সঙ্গে আপনি প্রেরণ করতে পারবেন না objকরার putএটা ভোটদান বা আরেক ধরনের যেমন প্রকাশক ছাড়া, কিন্তু অবশ্যই ফলাফলের ক্ষণস্থায়ী removeসরাসরি কাজ করে।
স্যামুয়েল এডউইন ওয়ার্ড

4
তবে কী কীভাবে সমস্ত কী কীভাবে
পুনর্নবীকরণ করবেন


20
hashMap.put("New_Key", hashMap.remove("Old_Key"));

এটি আপনি যা চান তা করতে পারে তবে আপনি লক্ষ্য করবেন যে কীটির অবস্থান পরিবর্তন হয়েছে।


@ ভিনগুলি ডকুমেন্টেশনগুলিতে পুনর্বিবেচনা করুন: ডি, অপসারণ () বস্তুটি ফিরিয়ে দেবে, এই টিউটোরিয়ালটি দেখুন
মোহাম্মদ জাকারিয়া এল-জোগবি

4
আমার খারাপ, আমি আমার মন্তব্য সরিয়েছি এবং এর পক্ষে ভোট দিয়েছি। এর জন্যে দুঃখিত.
ভিজ

19

একটি নতুন কীতে কীটির নতুন নামকরণ করা দরকার তার মান নির্ধারণ করুন। এবং পুরানো চাবিটি সরিয়ে ফেলুন।

hashMap.put("New_Key", hashMap.get("Old_Key"));
hashMap.remove("Old_Key");

10

আপনি keyএকবার যুক্ত হয়ে গেলে হ্যাশম্যাপটির নতুন নাম / পরিবর্তন করতে পারবেন না ।

একমাত্র উপায় হ'ল মুছে ফেলা / অপসারণ keyএবং নতুন keyএবং valueজুড়ি দিয়ে সন্নিবেশ করা ।

কারণ : হ্যাশম্যাপ অভ্যন্তরীণ বাস্তবায়নে হ্যাশম্যাপkeyসংশোধক হিসাবে চিহ্নিতfinal

static class Entry<K ,V> implements Map.Entry<K ,V>
{
    final K key;
    V value;
    Entry<K ,V> next;
    final int hash;
    ...//More code goes here
}

রেফারেন্সের জন্য: হ্যাশম্যাপ


এটি আমার মতে সেরা উত্তর কারণ কোনও চাবি নামকরণ সম্ভব নয়
ওল্ফসন

4

আপনি হ্যাশম্যাপ কীটির নাম পরিবর্তন করবেন না, আপনাকে নতুন কী দিয়ে একটি নতুন এন্ট্রি প্রবেশ করতে হবে এবং পুরানোটি মুছতে হবে।


2

আমি যুক্তি দিয়েছি যে হ্যাশম্যাপ কীগুলির সারমর্মটি সূচক অ্যাক্সেসের উদ্দেশ্যে এবং এর চেয়ে বেশি কিছুই নেই এখানে একটি হ্যাক রয়েছে: কী-র‌্যাপার বিষয়টিকে কীটির মানকে ঘিরে তৈরি করা যাতে কী-র‌্যাপার অবজেক্টটি সূচক অ্যাক্সেসের জন্য হ্যাশম্যাপ কী হয়ে যায়, তাই আপনি আপনার নির্দিষ্ট প্রয়োজনের জন্য কী-র‍্যাপার অবজেক্টের মান অ্যাক্সেস এবং পরিবর্তন করতে পারে:

public class KeyWrapper<T>{

      private T key;
      public KeyWrapper(T key){
         this.key=key;
       }

      public void rename(T newkey){
              this.key=newkey;
       }

}

উদাহরণ

   HashMap<KeyWrapper,String> hashmap=new HashMap<>();
   KeyWrapper key=new KeyWrapper("cool-key");
   hashmap.put(key,"value");
   key.rename("cool-key-renamed");

যদিও আপনার কোনও অ-বিদ্যমান কী হ্যাশম্যাপ থেকে বিদ্যমান কীটির মান পেতে সক্ষম হতে পারে তবে আমি আশঙ্কা করি এটি যেভাবেই হোক অপরাধী হতে পারে:

public  class KeyWrapper<T>{

        private T key;
        public KeyWrapper(T key){
            this.key=key;
        }

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

        @Override
        public int hashCode() {
            int hash=((String)key).length();//however you want your hash to be computed such that two different objects may share the same at some point
            return hash;
        }
    }

উদাহরণ

HashMap<KeyWrapper,String> hashmap=new HashMap<>();
KeyWrapper cool_key=new KeyWrapper("cool-key");
KeyWrapper fake_key=new KeyWrapper("fake-key");
hashmap.put(cool_key,"cool-value");
System.out.println("I don't believe it but its: "+hashmap.containsKey(fake_key)+" OMG!!!");

1

নীচের বিষয়গুলি দেখুন:

  1. না, আপনি নামান্তর করতে পারবে না keyএর HashMapএকবার যোগ করা হয়েছে।

  2. প্রথমে আপনাকে এটি মুছতে বা মুছতে হবে keyএবং তারপরে আপনি নতুন keyদিয়ে সন্নিবেশ করতে পারেন value

  3. কারণ HashMapঅভ্যন্তরীণ বাস্তবায়নে HashMapকী মডিফায়ার হয় final


0

আপনি পারেন যদি জাভা নেটিভ হাশম্যাপের পরিবর্তে আপনি একটি বিম্যাপ ব্যবহার করেন
এটি theতিহ্যবাহী মানচিত্র বাস্তবায়ন নয় এবং আপনার এটির প্রয়োজন অনুসারে এটি নিশ্চিত করতে হবে।

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

একটি বিম্যাপ ব্যবহার করে, আপনি ভিউটি বিপরীত করতে এবং কীটি প্রতিস্থাপন করতে পারেন।
অ্যাপাচি কমন্স বিডিম্যাপ এবং পেয়ারা বিম্যাপ উভয়ই চেকআউট করুন ।


0

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

getFriendlyFieldsMapping().forEach((friendlyKey, realKey) ->
    if (map.containsKey(friendlyKey))
        map.put(realKey, map.remove(friendlyKey))
);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.