জাভা হাশম্যাপ: মান থেকে কী কীভাবে পাবেন?


450

আমার যদি মান থাকে "foo"এবং HashMap<String> ftwযার জন্য আমি ftw.containsValue("foo")ফিরে trueআসি, আমি কী কীভাবে তা কী পেতে পারি? আমাকে কি হ্যাশম্যাপের মধ্য দিয়ে লুপ করতে হবে? এটি করার সর্বোত্তম উপায় কী?


72
মনে রাখবেন যে কোনও একক সম্পর্কিত কী নেই - একই মানটিতে একাধিক কী ম্যাপিং থাকতে পারে।
সিপারকিনস

1
@ সিগার্কিনস তবে <স্ট্রফিলনাম, রিডার> এবং আরও অনেকগুলি 1 থেকে 1 এর মতো হ্যাশম্যাপগুলির জন্য এটি খুব দরকারী।
অ্যাকোরিয়াস পাওয়ার

আপনার যদি আইটেমগুলির একটি ছোট সংগ্রহ থাকে তবে ধ্রুবক তৈরি করা বিবেচনা করুন public static final String TIME = "time";এবংproperties.put(TIME, PbActivityJpa_.time);
বাশির আল-মোমনি

সম্ভবত এটি আপনাকে মানচিত্র থেকে ডেটা পেতে সহায়তা করতে পারে এবং আপনি কিছু প্রসেসিংও করতে পারেন। frugalisminds.com/java/java-8-stream-map- উদাহরণ
সঞ্জয়-দেব

উত্তর:


215

আপনি যদি স্ট্যান্ডার্ড জাভা কালেকশন এপিআই এর পরিবর্তে কমন্স কালেকশন লাইব্রেরি ব্যবহার করতে চান, আপনি সহজেই এটি অর্জন করতে পারেন।

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

যদিও একটি সতর্কতা রয়েছে, বিড়ি মানচিত্রে কীগুলিতে একাধিক মান ম্যাপ করা যায় না এবং সুতরাং আপনার ডেটা সেটটিতে কী এবং মানগুলির মধ্যে 1: 1 ম্যাপিং না থাকলে আপনি বিডিম্যাপ ব্যবহার করতে পারবেন না।

হালনাগাদ

আপনি যদি জাভা সংগ্রহগুলি এপিআই-তে নির্ভর করতে চান, মানচিত্রে মান সন্নিবেশ করার সময় আপনাকে কী এবং মানগুলির মধ্যে 1: 1 সম্পর্ক নিশ্চিত করতে হবে। বলা সহজ, করা কঠিন.

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

আপডেট # 2

জেনারিক সহ বিড়ি মানচিত্রের জন্য সহায়তা গুগল পেয়ারা এবং রিফ্যাক্টরড কমন্স-কালেকশন লাইব্রেরিতে পাওয়া যাবে (পরে কোনও অ্যাপাচি প্রকল্প নয়)। অ্যাপাচি কমন্স সংগ্রহগুলিতে নিখোঁজ জেনেরিক সমর্থনটি নির্দেশ করার জন্য এসকোকে ধন্যবাদ। জেনেরিকের সাথে সংগ্রহগুলি ব্যবহার করা আরও রক্ষণাবেক্ষণযোগ্য কোড করে।


23
... এবং আপনি যদি জেনেরিক্স এবং সেই সমস্ত আধুনিক জিনিস পছন্দ করেন তবে গুগল সংগ্রহগুলিতে বিম্যাপ রয়েছে যেখানে আপনি biMap.inverse () কল করে কী মেলানো নির্দিষ্ট মান পেতে পারেন get পাবেন (মান);
এসকো

1
হ্যাঁ, অ্যাপাচি কমন্স সংগ্রহগুলি জেনেরিকগুলি সমর্থন করে না। যাইহোক, গুগল সংগ্রহ রয়েছে যেমন আপনি উল্লেখ করেছেন (যা আমি এখনও ব্যবহার করি না - এখনও কোনও 1.0 রিলিজ নেই), এবং জেনারিক্সের সহায়তায় রিফ্যাক্টরড কমন্স-সংগ্রহ রয়েছে। আপনি এটি সোর্সফোর্জ প্রকল্প হিসাবে দেখতে পাবেন @ সোর্সফোর্জ.এন. / প্রকল্পগুলি / সংগ্রহগুলি
ভিনিত রেনল্ডস

2
গুগল সংগ্রহগুলি কমন্স-সংগ্রহের একটি রিফ্যাক্টর সংস্করণ নয়
হুইস্কিসিয়ার

12
@ হুইস্কিসিয়ার: আমার মনে হয় না কেউ (বর্তমানে) এমনটি বলছে।
হাফ

2
অ্যাপাচি সংগ্রহগুলি এখন জেনেরিকস কমন্স.এপাচি.আর.গ্রাফিক্স
কমারস-

603

যদি আপনার ডেটা স্ট্রাকচারটিতে কী এবং মানগুলির মধ্যে একাধিক টু ওয়ান ম্যাপিং থাকে তবে আপনাকে এন্ট্রিগুলি দিয়ে পুনরাবৃত্তি করতে হবে এবং সমস্ত উপযুক্ত কী বেছে নেওয়া উচিত:

public static <T, E> Set<T> getKeysByValue(Map<T, E> map, E value) {
    Set<T> keys = new HashSet<T>();
    for (Entry<T, E> entry : map.entrySet()) {
        if (Objects.equals(value, entry.getValue())) {
            keys.add(entry.getKey());
        }
    }
    return keys;
}

ক্ষেত্রে একের সাথে এক সম্পর্ক, আপনাকে প্রথমে মিলেছে কী আসতে পারেন:

public static <T, E> T getKeyByValue(Map<T, E> map, E value) {
    for (Entry<T, E> entry : map.entrySet()) {
        if (Objects.equals(value, entry.getValue())) {
            return entry.getKey();
        }
    }
    return null;
}

জাভা 8 তে:

public static <T, E> Set<T> getKeysByValue(Map<T, E> map, E value) {
    return map.entrySet()
              .stream()
              .filter(entry -> Objects.equals(entry.getValue(), value))
              .map(Map.Entry::getKey)
              .collect(Collectors.toSet());
}

এছাড়াও, পেয়ারা ব্যবহারকারীদের জন্য, বিম্যাপ কার্যকর হতে পারে। উদাহরণ স্বরূপ:

BiMap<Token, Character> tokenToChar = 
    ImmutableBiMap.of(Token.LEFT_BRACKET, '[', Token.LEFT_PARENTHESIS, '(');
Token token = tokenToChar.inverse().get('(');
Character c = tokenToChar.get(token);

3
পারফরম্যান্স সম্পর্কে কিছু বলতে পারেন? এর চেয়ে বেশি কী অনুকূলিত হবে? এই নাকি বিড়িম্যাপ?
তাসোমানিয়াক

আমি একই সমাধানটি ভেবে দেখেছি, আমি অবশ্যই এটি উত্সাহিত করেছি তবে সত্যিকারের বৃহত সংগ্রহগুলির ক্ষেত্রে আমি এর দক্ষতার বিষয়ে সন্দেহ করি doubt
arjacsoh

3
stackoverflow.com/questions/4553624/hashmap-get-put-complexity হ্যাশম্যাপের সময় জটিলতা রয়েছে o(1)। আপনি যদি মানগুলি নিয়ে পুনরাবৃত্তি করেন তবে এটি কার্যকারিতাটি হারাবে। আপনি যদি চান better performanceএবং একটি one-oneসম্পর্ক চান তবে আপনি another mapযেখানে ব্যবহার করতে পারেনvalue is a key
veer7

3
আমি প্রতিস্থাপন করতে সুপারিশ .filter(entry -> entry.getValue().equals(value))সঙ্গে যেমন সম্পর্কে কোন বিবৃতি ক্ষমতা করা হয়। উপরন্তু, আপনি প্রতিস্থাপন করতে পারেন সঙ্গে.filter(entry ->Objects.equals(entry.getValue(), value))null.map(entry -> entry.getKey()).map(Map.Entry::getKey)
হোলগার

<T> getKeysByValue () সেট করার আগে <টি, ই> স্বরলিপি বুঝতে আমার অসুবিধা হচ্ছে ... কী কথা .... এটি ব্যবহার না করে এটি করার বিভিন্ন উপায়? ধন্যবাদ
ponderingdev

76
public class NewClass1 {

    public static void main(String[] args) {
       Map<Integer, String> testMap = new HashMap<Integer, String>();
        testMap.put(10, "a");
        testMap.put(20, "b");
        testMap.put(30, "c");
        testMap.put(40, "d");
        for (Entry<Integer, String> entry : testMap.entrySet()) {
            if (entry.getValue().equals("c")) {
                System.out.println(entry.getKey());
            }
        }
    }
}

কিছু অতিরিক্ত তথ্য ... আপনার কাজে লাগতে পারে

আপনার হ্যাশম্যাপটি যদি সত্যিই বড় হয় তবে উপরের পদ্ধতিটি ভাল নাও লাগতে পারে। যদি আপনার হ্যাশম্যাপে অনন্য মান ম্যাপিংয়ের জন্য অনন্য কী থাকে তবে আপনি মান থেকে কীতে ম্যাপিং থাকা আরও একটি হ্যাশম্যাপ বজায় রাখতে পারেন।

এটি আপনাকে দুটি হ্যাশম্যাপ বজায় রাখতে হবে

1. Key to value

2. Value to key 

সেক্ষেত্রে আপনি কী পেতে দ্বিতীয় হ্যাশম্যাপ ব্যবহার করতে পারেন।


19

আমি মনে করি আপনার পছন্দগুলি

  • গুগল সংগ্রহ থেকে বিম্যাপের মতো এর জন্য নির্মিত মানচিত্রের প্রয়োগটি ব্যবহার করুন । নোট করুন যে গুগল সংগ্রহগুলি বিম্যাপের জন্য মূল্যগুলির পাশাপাশি অনন্য কীগুলি প্রয়োজন, তবে এটি উভয় দিকের পারফরম্যান্সে উচ্চ কার্যকারিতা সরবরাহ করে
  • ম্যানুয়ালি দুটি মানচিত্র বজায় রাখুন - একটি কী -> মানের জন্য, এবং মানটির জন্য অন্য মানচিত্র -> কী
  • এর মাধ্যমে entrySet()এবং কীগুলির সাথে মান মেলে তা সন্ধান করুন। এটি সবচেয়ে ধীরতম পদ্ধতি, যেহেতু এটি পুরো সংগ্রহের মাধ্যমে পুনরাবৃত্তি প্রয়োজন, অন্য দুটি পদ্ধতির জন্য এটির প্রয়োজন নেই।

19

আপনি আপনার মানচিত্রের কাঠামোতে কী, মান জোড়া এবং এর বিপরীত উভয়ই সন্নিবেশ করতে পারেন

map.put("theKey", "theValue");
map.put("theValue", "theKey");

Map.get ("theValue") ব্যবহার করে তারপরে "theKey" ফিরে আসবে।

এটি একটি দ্রুত এবং নোংরা উপায় যা আমি অবিচ্ছিন্ন মানচিত্র তৈরি করেছি, যা কেবলমাত্র কয়েকটি নির্বাচিত কিছু ডেটাসেটের জন্য কাজ করবে:

  • কেবল 1 থেকে 1 জোড়া থাকে
  • মানগুলির সেটটি কীগুলির সেট থেকে বিরত থাকে (1-> 2, 2-> 3 এটি বিরতি দেয়)

4
এটি আসলে সঠিক নয়। এটির জন্য কেবল 1-1 প্রয়োজন হয় না, তবে মানগুলির সেটটি কীগুলির সেট থেকে পৃথক হওয়া। আপনি এটি দ্বিপদী মানচিত্রের জন্য প্রয়োগ করতে পারবেন না {1 -> 2, 2 -> 3}: 2 মান এবং কী উভয়ই।
লুইস এ। ফ্লোরিট

15

আপনার নিজস্ব প্রয়োগের সাথে মানচিত্র সাজাইয়া রাখুন

class MyMap<K,V> extends HashMap<K, V>{

    Map<V,K> reverseMap = new HashMap<V,K>();

    @Override
    public V put(K key, V value) {
        // TODO Auto-generated method stub
        reverseMap.put(value, key);
        return super.put(key, value);
    }

    public K getKey(V value){
        return reverseMap.get(value);
    }
}

আমি মনে করি এটি একটি আকর্ষণীয় পদ্ধতির, যদিও যেহেতু সম্পর্কটি 1: 1 হওয়া উচিত তাই আমি হ্যাশম্যাপকে পুরোপুরি মুক্তি দেব এবং মানচিত্র <কে, ভি> ইন্টারফেসটি বাস্তবায়িত করব যাতে মান, মান এবং কী উভয়ের সদৃশ এড়াতে পারি।
ফ্রান মারজোয়া

11

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


11

সেই মানটিতে মানচিত্রের সমস্ত কীগুলি খুঁজে পেতে হ্যাশম্যাপের সমস্ত জোড়ায় পুনরাবৃত্তি করুন map.entrySet()


4
এই সমাধানটি ভয়াবহভাবে নিবিড়, এমন স্থানে যেখানে এটি বড় হ্যাশম্যাপগুলিতে অযৌক্তিক।
জোহোত 200

10

জাভা 8 ব্যবহার করে:

ftw.forEach((key, value) -> {
    if (value.equals("foo")) {
        System.out.print(key);
    }
});

6
value=="foo" এটি কাজ করবে না। equalsস্ট্রিংগুলির তুলনা করতে ব্যবহার করা উচিত।
আন্তন বালানিয়ুক

@ অ্যান্টন, valueইন্টার্ন করা না হলে সত্য ।
ফ্রোডডট

9

আপনি যদি নিজের কোডে মানচিত্রটি তৈরি করেন তবে কী এবং মানটি মানচিত্রে একসাথে রাখার চেষ্টা করুন:

public class KeyValue {
    public Object key;
    public Object value;
    public KeyValue(Object key, Object value) { ... }
}

map.put(key, new KeyValue(key, value));

তারপরে আপনার যখন মান হয় তখন আপনার কীও থাকে।


3
চতুর, তবে যদি সেখানে 2 বা ততোধিক কীভ্যালু অবজেক্ট একই মান থাকে? কোনটি বেছে নেওয়া উচিত?
ভিনিতে রেনল্ডস

2
@ ভিনিট, আমি দেখতে পাচ্ছি না যে এই পদ্ধতির মাধ্যমে ওপির প্রশ্নটি কীভাবে সমাধান করা যায়। "তারপরে আপনার যখন মূল্য আছে তখন আপনার কীও আছে?"
কিয়াং লি

9

আমি মনে করি এটি সেরা সমাধান, আসল ঠিকানা: জাভা 2 এস

    import java.util.HashMap;
    import java.util.Map;

        public class Main {

          public static void main(String[] argv) {
            Map<String, String> map = new HashMap<String, String>();
            map.put("1","one");
            map.put("2","two");
            map.put("3","three");
            map.put("4","four");

            System.out.println(getKeyFromValue(map,"three"));
          }


// hm is the map you are trying to get value from it
          public static Object getKeyFromValue(Map hm, Object value) {
            for (Object o : hm.keySet()) {
              if (hm.get(o).equals(value)) {
                return o;
              }
            }
            return null;
          }
        }

একটি সহজ ব্যবহার: আপনি যদি হ্যাশম্যাপে সমস্ত ডেটা রাখেন এবং আপনার আইটেম = "অটোমোবাইল" থাকে, তাই আপনি হ্যাশম্যাপে এর কীটি দেখছেন। এটা ভাল সমাধান।

getKeyFromValue(hashMap, item);
System.out.println("getKeyFromValue(hashMap, item): "+getKeyFromValue(hashMap, item));

7

আমি ভয় পাচ্ছি আপনাকে কেবল আপনার মানচিত্রটি পুনরাবৃত্তি করতে হবে। সবচেয়ে কম আমি এখানে আসতে পারি:

Iterator<Map.Entry<String,String>> iter = map.entrySet().iterator();
while (iter.hasNext()) {
    Map.Entry<String,String> entry = iter.next();
    if (entry.getValue().equals(value_you_look_for)) {
        String key_you_look_for = entry.getKey();
    }
}


6

মনে হচ্ছে আপনার পক্ষে এন্ট্রিগুলি পুনরাবৃত্তি করার সর্বোত্তম উপায়টি সম্ভবত map.entrySet()যেহেতু এটি map.containsValue()করে।


হ্যাঁ, এটি ঠিক তাই করে। তবে অবশ্যই এটি একটি মান খুঁজে পাওয়ার সাথে সাথে সত্যটি ফিরে আসে যার জন্য। সমমানগুলি সত্য, ওপি সম্ভবত যা করতে হবে তার বিপরীতে।
সিপারকিনস

1
ঠিক আছে, এন্ট্রিগুলির মাধ্যমে পুনরাবৃত্তি কীগুলির সাথে ফিরে আসার সাথে সাথে এটি একটি মানানসই মান খুঁজে পাবে। একাধিক ম্যাচ উদ্বেগ বলে মনে হয় নি।
জোনাস কে

6

অ্যান্ড্রয়েড বিকাশের লক্ষ্যমাত্রা API <19 এর জন্য, ভিটালি ফিডোরেনকো এক-এক-এক সম্পর্কের সমাধান কাজ করে না কারণ Objects.equalsপ্রয়োগ করা হয়নি। এখানে একটি সহজ বিকল্প:

public <K, V> K getKeyByValue(Map<K, V> map, V value) {
    for (Map.Entry<K, V> entry : map.entrySet()) {
            if (value.equals(entry.getValue())) {
            return entry.getKey();
        }
    }
    return null;
}

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

3

আপনি নীচে ব্যবহার করতে পারেন:

public class HashmapKeyExist {
    public static void main(String[] args) {
        HashMap<String, String> hmap = new HashMap<String, String>();
        hmap.put("1", "Bala");
        hmap.put("2", "Test");

        Boolean cantain = hmap.containsValue("Bala");
        if(hmap.containsKey("2") && hmap.containsValue("Test"))
        {
            System.out.println("Yes");
        }
        if(cantain == true)
        {
            System.out.println("Yes"); 
        }

        Set setkeys = hmap.keySet();
        Iterator it = setkeys.iterator();

        while(it.hasNext())
        {
            String key = (String) it.next();
            if (hmap.get(key).equals("Bala"))
            {
                System.out.println(key);
            }
        }
    }
}

এটি দুর্দান্ত যে আপনি দরকারী জিনিস সরবরাহ করতে চান, তবে এটি একটি "কেবল কোড" উত্তর হওয়া উচিত নয় এবং কোড নিজেই কোড গন্ধে পূর্ণ হওয়া উচিত নয় either
টম

2

হ্যাঁ, আপনাকে হ্যাশম্যাপটি লুপ করতে হবে, যদি না আপনি এই বিভিন্ন উত্তরগুলির পরামর্শ অনুসারে কিছু বাস্তবায়ন করেন। এন্ট্রিসেটের সাথে ঝাঁকুনির পরিবর্তে, আমি কেবল কীসেট () পেয়েছিলাম, সেই সেটটি দিয়ে পুনরাবৃত্তি করব এবং (প্রথম) কীটি রাখব যা আপনাকে আপনার মানানসই মান দেয়। যদি সেই মানটির সাথে মেলে এমন সমস্ত কীগুলি আপনার প্রয়োজন হয় তবে অবশ্যই আপনাকে পুরো জিনিসটি করতে হবে।

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

এছাড়াও, অন্য উত্তরের তুলনায় আপনার বিপরীত মানচিত্রটি যদি দেখতে লাগে

Map<Value, Set<Key>>

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


2

আপনি নিম্নলিখিত কোড ব্যবহার করে মানগুলি ব্যবহার করে কীটি পেতে পারেন ..

ArrayList valuesList = new ArrayList();
Set keySet = initalMap.keySet();
ArrayList keyList = new ArrayList(keySet);

for(int i = 0 ; i < keyList.size() ; i++ ) {
    valuesList.add(initalMap.get(keyList.get(i)));
}

Collections.sort(valuesList);
Map finalMap = new TreeMap();
for(int i = 0 ; i < valuesList.size() ; i++ ) {
    String value = (String) valuesList.get(i);

    for( int j = 0 ; j < keyList.size() ; j++ ) {
        if(initalMap.get(keyList.get(j)).equals(value)) {
            finalMap.put(keyList.get(j),value);
        }   
    }
}
System.out.println("fianl map ---------------------->  " + finalMap);

2
public static class SmartHashMap <T1 extends Object, T2 extends Object> {
    public HashMap<T1, T2> keyValue;
    public HashMap<T2, T1> valueKey;

    public SmartHashMap(){
        this.keyValue = new HashMap<T1, T2>();
        this.valueKey = new HashMap<T2, T1>();
    }

    public void add(T1 key, T2 value){
        this.keyValue.put(key, value);
        this.valueKey.put(value, key);
    }

    public T2 getValue(T1 key){
        return this.keyValue.get(key);
    }

    public T1 getKey(T2 value){
        return this.valueKey.get(value);
    }

}

আমি মনে করি একটি ব্যাখ্যা যুক্ত করে এই উত্তরটির উন্নতি করা যেতে পারে।
জোনাথন

2
-1। আমি এটি Stringকী এবং মান হিসাবে পরীক্ষা করেছি । আমি যখন ফোন করি map.add("1", "2"); map.add("1","3");তখন আমি কল map.getKey("2");এবং পুনরুদ্ধার করতে পারি "1", যদিও "1"এর চাবিকাঠি "3"
jlordo

@ জোনাথন এই শ্রেণীর পিছনে ধারণাটি হ'ল বিপরীত ম্যাপিংয়ের সাথে অন্য একটি হ্যাশম্যাপ রাখা যাতে কোনও কী থেকে কোনও মান পুনরুদ্ধার করা ছাড়াও আপনি কোনও মান থেকে কীটি পুনরুদ্ধার করতে পারেন। টি 1 এবং টি 2 ক্লাসগুলি কিছুটা বিভ্রান্তিকর; এর পরিবর্তে সম্ভবত আক্ষরিকভাবে তাদের কী এবং মানটির নাম দিন? যদিও আমি ডেটা এবং আপনি কী চান তার উপর নির্ভর করে একাধিক মান বা একাধিক কী এর বিনিময়ে পাওয়ার সম্ভাবনাটি আশা করব। সাবধানতার সাথে ব্যবহার করুন
চিকোভিটস

1
"টেকনাটহোসায়সনি" 1 "" 2 "(আর) এর কী নয়। এটিও আপনার প্রশ্নের উত্তর, কলিং getValue("1")ফিরে আসবে 3
jlordo

দুঃখিত জেলর্ডো, আমি স্ট্যান্ডার্ড হাশম্যাপ আচরণ সম্পর্কে ভুল করেছিলাম: আপনি কী সঠিক যে একটি কী জন্য একটি নতুন মান যুক্ত করা পুরানো মান প্রতিস্থাপন করা উচিত
চিকোভিটজ

2

জাভা 8 এ

map.entrySet().stream().filter(entry -> entry.getValue().equals(value))
    .forEach(entry -> System.out.println(entry.getKey()));

2
public static String getKey(Map<String, Integer> mapref, String value) {
    String key = "";
    for (Map.Entry<String, Integer> map : mapref.entrySet()) {
        if (map.getValue().toString().equals(value)) {
            key = map.getKey();
        }
    }
    return key;
}

মানচিত্র <স্ট্রিং, পূর্ণসংখ্যা> মানচিত্র = নতুন হ্যাশম্যাপ <স্ট্রিং, পূর্ণসংখ্যক> (); মানচিত্র.পুট ("এ", ১); মানচিত্র.পুট ("বি", 2); মানচিত্র.পুট ("সি", 3); মানচিত্র.পুট ("ডি", 4); // System.out.println (মানচিত্র); System.out.println (getKey (মানচিত্র, "4"));
আশ্চর্যজনক ভারত

1
একাধিক কীগুলির একই মান থাকলে কী হয়?
সি পি ফিন

আপনি যখন একাধিক কী পাস করেন তখন একই মান হয়, ফলস্বরূপ আমরা শেষ কীটি পেয়ে যাব। উদাহরণস্বরূপ: এ 1, বি 1, সি 1, ডি 2 আউটপুট: আমরা 1 মানটি পাস করলে আউটপুট সি হবে
আশ্চর্যজনক ভারত

@ আমাজিংইন্ডিয়া এটির নিশ্চয়তা নেই এবং নির্দিষ্ট মানচিত্রের প্রয়োগের উপর এটি সম্পূর্ণ নির্ভর করে। উদাহরণস্বরূপ হ্যাশম্যাপ কোনও আদেশের গ্যারান্টি দেয় না, সুতরাং কী আউটপুট এখানে ফিরে আসবে সে সম্পর্কে আপনার কোনও ধারণা নেই।
নীলস ডৌসেট

1
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;

public class ValueKeysMap<K, V> extends HashMap <K,V>{
    HashMap<V, Set<K>> ValueKeysMap = new HashMap<V, Set<K>>();

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

    @Override
    public V put(K key, V value) {
        if (containsValue(value)) {
            Set<K> keys = ValueKeysMap.get(value);
            keys.add(key);
        } else {
            Set<K> keys = new HashSet<K>();
            keys.add(key);
            ValueKeysMap.put(value, keys);
        }
        return super.put(key, value);
    }

    @Override
    public V remove(Object key) {
        V value = super.remove(key);
        Set<K> keys = ValueKeysMap.get(value);
        keys.remove(key);
        if(keys.size() == 0) {
           ValueKeysMap.remove(value);
        }
        return value;
    }

    public Set<K> getKeys4ThisValue(V value){
        Set<K> keys = ValueKeysMap.get(value);
        return keys;
    }

    public boolean valueContainsThisKey(K key, V value){
        if (containsValue(value)) {
            Set<K> keys = ValueKeysMap.get(value);
            return keys.contains(key);
        }
        return false;
    }

    /*
     * Take care of argument constructor and other api's like putAll
     */
}

1
/**
 * This method gets the Key for the given Value
 * @param paramName
 * @return
 */
private String getKeyForValueFromMap(String paramName) {
    String keyForValue = null;
    if(paramName!=null)) {
        Set<Entry<String,String>> entrySet = myMap().entrySet();
        if(entrySet!=null && entrySet.size>0) {
            for(Entry<String,String> entry : entrySet) {
                if(entry!=null && paramName.equalsIgnoreCase(entry.getValue())) {
                    keyForValue = entry.getKey();
                }
            }
        }
    }
    return keyForValue;
}

1
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

public class M{
public static void main(String[] args) {

        HashMap<String, List<String>> resultHashMap = new HashMap<String, List<String>>();

        Set<String> newKeyList = resultHashMap.keySet();


        for (Iterator<String> iterator = originalHashMap.keySet().iterator(); iterator.hasNext();) {
            String hashKey = (String) iterator.next();

            if (!newKeyList.contains(originalHashMap.get(hashKey))) {
                List<String> loArrayList = new ArrayList<String>();
                loArrayList.add(hashKey);
                resultHashMap.put(originalHashMap.get(hashKey), loArrayList);
            } else {
                List<String> loArrayList = resultHashMap.get(originalHashMap
                        .get(hashKey));
                loArrayList.add(hashKey);
                resultHashMap.put(originalHashMap.get(hashKey), loArrayList);
            }
        }

        System.out.println("Original HashMap : " + originalHashMap);
        System.out.println("Result HashMap : " + resultHashMap);
    }
}

1

পাতলা মোড়ক ব্যবহার করুন: এইচএম্যাপ

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public class HMap<K, V> {

   private final Map<K, Map<K, V>> map;

   public HMap() {
      map = new HashMap<K, Map<K, V>>();
   }

   public HMap(final int initialCapacity) {
      map = new HashMap<K, Map<K, V>>(initialCapacity);
   }

   public boolean containsKey(final Object key) {
      return map.containsKey(key);
   }

   public V get(final Object key) {
      final Map<K, V> entry = map.get(key);
      if (entry != null)
         return entry.values().iterator().next();
      return null;
   }

   public K getKey(final Object key) {
      final Map<K, V> entry = map.get(key);
      if (entry != null)
         return entry.keySet().iterator().next();
      return null;
   }

   public V put(final K key, final V value) {
      final Map<K, V> entry = map
            .put(key, Collections.singletonMap(key, value));
      if (entry != null)
         return entry.values().iterator().next();
      return null;
   }
}

1

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

String[] keys =  yourMap.keySet().toArray(new String[0]);

for(int i = 0 ; i < keys.length ; i++){
    //This is your key    
    String key = keys[i];

    //This is your value
    yourMap.get(key)            
}

এবং কেন কেউ এই পদ্ধতির ব্যবহার করা উচিত? আপনি ইতিমধ্যে বলেছিলেন, অন্যান্য পদ্ধতির চেয়ে কর্মক্ষমতা আরও খারাপ হবে।
টম

1

আমি মনে করি কী- সেট () মানটি ম্যাপিং কীগুলি সন্ধান করা ভাল এবং এন্ট্রিসেট () এর চেয়ে আরও ভাল কোডিং স্টাইল থাকতে পারে

উদা:

ধরুন আপনি একটি HashMap আছে মানচিত্র , ArrayList মাঝামাঝি , একটি মান আপনি খুঁজতে চান সব কী করতে ম্যাপিং, তারপর চাবি সংরক্ষণ মাঝামাঝি

আপনি নীচে কোড লিখতে পারেন:

    for (int key : map.keySet()) {
        if (map.get(key) == value) {
            res.add(key);
        }
    }

পরিবর্তে নীচে এন্ট্রিসেট () ব্যবহার করুন:

    for (Map.Entry s : map.entrySet()) {
        if ((int)s.getValue() == value) {
            res.add((int)s.getKey());
        }
    }

আশা করি এটা সাহায্য করবে :)


map.get(key) == valueআপনি যেমন রেফারেন্স তুলনা করছেন তখন অবজেক্টের সাম্যতা যাচাই করা ভাল ধারণা নয়। অবজেক্টের সাম্যতা সর্বদা তাদের.equals()
frododot

1

যদিও এটি সরাসরি প্রশ্নের উত্তর দেয় না, এটি সম্পর্কিত।

এইভাবে আপনার তৈরি / পুনরাবৃত্তি চালিয়ে যাওয়ার দরকার নেই। কেবল একবার বিপরীত মানচিত্র তৈরি করুন এবং আপনার যা প্রয়োজন তা পান।

/**
 * Both key and value types must define equals() and hashCode() for this to work.
 * This takes into account that all keys are unique but all values may not be.
 *
 * @param map
 * @param <K>
 * @param <V>
 * @return
 */
public static <K, V> Map<V, List<K>> reverseMap(Map<K,V> map) {
    if(map == null) return null;

    Map<V, List<K>> reverseMap = new ArrayMap<>();

    for(Map.Entry<K,V> entry : map.entrySet()) {
        appendValueToMapList(reverseMap, entry.getValue(), entry.getKey());
    }

    return reverseMap;
}


/**
 * Takes into account that the list may already have values.
 * 
 * @param map
 * @param key
 * @param value
 * @param <K>
 * @param <V>
 * @return
 */
public static <K, V> Map<K, List<V>> appendValueToMapList(Map<K, List<V>> map, K key, V value) {
    if(map == null || key == null || value == null) return map;

    List<V> list = map.get(key);

    if(list == null) {
        List<V> newList = new ArrayList<>();
        newList.add(value);
        map.put(key, newList);
    }
    else {
        list.add(value);
    }

    return map;
}

0

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

সিরিয়ালাইজড বিড়িম্যাপের জন্য যা ডুপ্লিকেট মানগুলিকে সমর্থন করে (1-থেকে বহু দৃশ্যে ) এছাড়াও MapDB.org বিবেচনা করুন


0
  1. আপনি যদি মান থেকে কীটি পেতে চান তবে এটি বিডিম্যাপ (দ্বি-দিকনির্দেশক মানচিত্র) ব্যবহারের সেরা, আপনি ও (1) সময়ে মান থেকে কীটি পেতে পারেন।

    তবে, এর সাথে অপূর্ণতা হ'ল আপনি কেবল অনন্য কীসেট এবং মান সেট ব্যবহার করতে পারেন।

  2. টেবিল ইন জাভা নামে একটি ডেটা স্ট্রাকচার রয়েছে যা মানচিত্রের মানচিত্র ছাড়া কিছুই নয়

    সারণী <এ, বি, সি> == মানচিত্র <ক, মানচিত্র <বি, সি>>

    এখানে আপনি map<B,C>জিজ্ঞাসা করে পেতে পারেন T.row(a);, এবং আপনি map<A,C>জিজ্ঞাসা করেও পেতে পারেনT.column(b);

আপনার বিশেষ ক্ষেত্রে, কিছু ধ্রুবক হিসাবে সি .োকান।

সুতরাং, এটি <a1, b1, 1> <a2, b2, 1>, ...

সুতরাং, আপনি যদি T.row (a1) ---> এর মাধ্যমে মানচিত্রটি খুঁজে পান তবে>> এই ফেরত মানচিত্রটি কীসেট পান।

যদি আপনার তখন কী মানটি খুঁজে পেতে হয় তবে, টি কলাম (বি 2) -> এর মানচিত্র ফেরত দেয় -> ফেরত মানচিত্রের কীসেট পান।

পূর্ববর্তী মামলার তুলনায় সুবিধা:

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