জাভায় হ্যাশম্যাপ থেকে কীগুলি পান


166

আমার জাভাতে এই জাতীয় একটি হাশম্যাপ রয়েছে:

private Map<String, Integer> team1 = new HashMap<String, Integer>();

তারপরে আমি এটিকে পূরণ করব:

team1.put("United", 5);

আমি কীগুলি পেতে পারি? এর মতো কিছু: team1.getKey()"ইউনাইটেড" ফিরিয়ে দেওয়া।


আপনি কী প্রত্যাশা team1.getKey()করবেন: (১) মানচিত্রটি খালি থাকলে বা (২) এতে একাধিক কী রয়েছে?
এনপিই

intএই মত একক জন্য ব্যবহার করা উচিত।
stommestack

উত্তর:


312

একজন HashMapএকটির বেশি কী আছে। আপনি keySet()সমস্ত কীগুলির সেট পেতে ব্যবহার করতে পারেন ।

team1.put("foo", 1);
team1.put("bar", 2);

সংরক্ষণ করবে 1কী দিয়ে "foo"এবং 2কী দিয়ে "bar"। সমস্ত কীগুলির মাধ্যমে পুনরাবৃত্তি করতে:

for ( String key : team1.keySet() ) {
    System.out.println( key );
}

মুদ্রণ "foo"এবং "bar"


তবে এই ক্ষেত্রে আমার কাছে প্রতিটি মানের জন্য একটি কী রয়েছে key Team1.getKey () এর মতো কিছু লেখা কি সম্ভব নয়?
masb

না আপনার কাছে একটি উপাদান সহ একটি মানচিত্র নেই। তবে এটি একটি মানচিত্র: এমন কাঠামো যাতে একাধিক উপাদান থাকতে পারে।
মাত্তেও

13
একক কী দিয়ে মানচিত্রটির বিন্দুটি কী? একটি মূল ক্ষেত্র এবং একটি মান ক্ষেত্র সহ একটি শ্রেণী তৈরি করুন।
জেবি নিজত

আমি আমার সমস্যা ভুল বুঝেছি। আপনার উত্তরের জন্য ধন্যবাদ।
মাসব

3
আপনি যদি অ্যারের তালিকায় সমস্ত কী সংরক্ষণ করতে চান:List<String> keys = new ArrayList<>(mLoginMap.keySet());
প্রতীক বুটানি

50

অন্তত তত্ত্বের ক্ষেত্রে এটি করণীয়, যদি আপনি সূচকটি জানেন:

System.out.println(team1.keySet().toArray()[0]);

keySet() একটি সেট ফেরত দেয়, তাই আপনি সেটটিকে একটি অ্যারেতে রূপান্তর করেন।

অবশ্যই সমস্যাটি হ'ল কোনও সেট আপনার আদেশ রাখার প্রতিশ্রুতি দেয় না। আপনার হ্যাশম্যাপে যদি কেবল একটি আইটেম থাকে তবে আপনি ভাল, তবে এর চেয়ে আরও বেশি কিছু থাকলে উত্তরগুলি যেমন উত্তর দিয়ে থাকে তেমন মানচিত্রটি লুপ করা ভাল।


এটি এমন একক পরীক্ষার দৃশ্যে সহায়ক যেখানে আপনার সামগ্রীর সামগ্রীর উপর আপনার সম্পূর্ণ নিয়ন্ত্রণ রয়েছে HashMap। ভাল প্রদর্শনী.
রাইজিংটাইড

প্রশ্নে সূচকটি জানার কিছুই নেই।
লার্নের মারকুইস

23

এটা যাচাই কর.

https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html

( java.util.Objects.equalsহ্যাশম্যাপ থাকতে পারে বলে ব্যবহার করুন null)

JDK8 + ব্যবহার করা

/**
 * Find any key matching a value.
 *
 * @param value The value to be matched. Can be null.
 * @return Any key matching the value in the team.
 */
private Optional<String> getKey(Integer value){
    return team1
        .entrySet()
        .stream()
        .filter(e -> Objects.equals(e.getValue(), value))
        .map(Map.Entry::getKey)
        .findAny();
}

/**
 * Find all keys matching a value.
 *
 * @param value The value to be matched. Can be null.
 * @return all keys matching the value in the team.
 */
private List<String> getKeys(Integer value){
    return team1
        .entrySet()
        .stream()
        .filter(e -> Objects.equals(e.getValue(), value))
        .map(Map.Entry::getKey)
        .collect(Collectors.toList());
}

আরও "জেনেরিক" এবং যতটা সম্ভব নিরাপদ

/**
 * Find any key matching the value, in the given map.
 *
 * @param mapOrNull Any map, null is considered a valid value.
 * @param value     The value to be searched.
 * @param <K>       Type of the key.
 * @param <T>       Type of the value.
 * @return An optional containing a key, if found.
 */
public static <K, T> Optional<K> getKey(Map<K, T> mapOrNull, T value) {
    return Optional.ofNullable(mapOrNull).flatMap(map -> map.entrySet()
            .stream()
            .filter(e -> Objects.equals(e.getValue(), value))
            .map(Map.Entry::getKey)
            .findAny());
}

বা আপনি যদি জেডিকে 7 তে থাকেন।

private String getKey(Integer value){
    for(String key : team1.keySet()){
        if(Objects.equals(team1.get(key), value)){
            return key; //return the first found
        }
    }
    return null;
}

private List<String> getKeys(Integer value){
   List<String> keys = new ArrayList<String>();
   for(String key : team1.keySet()){
        if(Objects.equals(team1.get(key), value)){
             keys.add(key);
      }
   }
   return keys;
}

2
তবে কি কি ঘটে যদি বেশ কয়েকটি কী একই মানকে মানচিত্র করে? পরিবর্তে আপনার কীগুলির একটি তালিকা ফেরত দেওয়া উচিত
অস্কার লোপেজ

@ ÓscarLópez তারা পারবে না। HashMapকীগুলি অনন্য।
লার্নের মারকুইস

6

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


1

যেহেতু আপনি যুক্তি ( United) যার জন্য মান দেওয়া হচ্ছে ( 5) পেতে চান আপনি দ্বি-নির্দেশমূলক মানচিত্র (যেমন পেয়ারা দ্বারা সরবরাহিত: http://docs.guava-libraries.googlecode.com/git/javadoc/com/google /common/collect/BiMap.html )।


1

আপনার যদি কেবল সাধারণ কিছু এবং যাচাইকরণের আরও কিছু প্রয়োজন হয়।

public String getKey(String key)
{
    if(map.containsKey(key)
    {
        return key;
    }
    return null;
}

তারপরে আপনি যে কোনও চাবি অনুসন্ধান করতে পারেন।

System.out.println( "Does this key exist? : " + getKey("United") );

1
এই পদ্ধতিটি সম্পূর্ণ অপ্রয়োজনীয়।
লার্নের মারকুইস

1
private Map<String, Integer> _map= new HashMap<String, Integer>();
Iterator<Map.Entry<String,Integer>> itr=  _map.entrySet().iterator();
                //please check 
                while(itr.hasNext())
                {
                    System.out.println("key of : "+itr.next().getKey()+" value of      Map"+itr.next().getValue());
                }

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

0

দ্রুত পুনরাবৃত্তির জন্য ক্রিয়ামূলক ক্রিয়াকলাপ ব্যবহার করুন।

team1.keySet().forEach((key) -> { System.out.println(key); });


-1

একটি সমাধান হতে পারে, যদি আপনি মূল অবস্থানটি জানেন তবে কীগুলি একটি স্ট্রিং অ্যারে রূপান্তর করুন এবং অবস্থানে মানটি ফিরিয়ে আনুন:

public String getKey(int pos, Map map) {
    String[] keys = (String[]) map.keySet().toArray(new String[0]);

    return keys[pos];
}

প্রশ্নে সূচকটি জানার কিছুই নেই।
লার্নের মারকুইস

-2

এই সাধারণ প্রোগ্রামটি ব্যবহার করে দেখুন:

public class HashMapGetKey {

public static void main(String args[]) {

      // create hash map

       HashMap map = new HashMap();

      // populate hash map

      map.put(1, "one");
      map.put(2, "two");
      map.put(3, "three");
      map.put(4, "four");

      // get keyset value from map

Set keyset=map.keySet();

      // check key set values

      System.out.println("Key set values are: " + keyset);
   }    
}

-2
public class MyHashMapKeys {

    public static void main(String a[]){
        HashMap<String, String> hm = new HashMap<String, String>();
        //add key-value pair to hashmap
        hm.put("first", "FIRST INSERTED");
        hm.put("second", "SECOND INSERTED");
        hm.put("third","THIRD INSERTED");
        System.out.println(hm);
        Set<String> keys = hm.keySet();
        for(String key: keys){
            System.out.println(key);
        }
    }
}

কেবলমাত্র বিদ্যমান উত্তরগুলি অনুলিপি করে। -1
james.garriss

-2

হাশম্যাপে কীগুলি পেতে, আমাদের কাছে কীসেট () পদ্ধতি রয়েছে যা java.util.Hashmapপ্যাকেজে উপস্থিত রয়েছে । প্রাক্তন:

Map<String,String> map = new Hashmap<String,String>();
map.put("key1","value1");
map.put("key2","value2");

// Now to get keys we can use keySet() on map object
Set<String> keys = map.keySet();

এখন কীগুলিতে আপনার সমস্ত কী মানচিত্রে উপলব্ধ থাকবে। উদা: [কী 1, কী 2]


java,util.HashMapএকটি শ্রেণি, প্যাকেজ নয় এবং এখানে এমন কিছুই নেই যা পাঁচ বছর আগে এখানে ছিল না।
মারকুইস

-3

আমি যা করব যা খুব সহজ তবে নষ্ট মেমোরিটি হ'ল একটি কী দিয়ে মানগুলি মানচিত্র করা এবং কীগুলি মান তৈরি করে ওপোসাইটটি মানচিত্র করা:

private Map<Object, Object> team1 = new HashMap<Object, Object>();

<Object, Object>আপনি ম্যাপিং keys:Valueএবং এটি Value:Keysপছন্দ করতে পারেন তাই এটি ব্যবহার করা গুরুত্বপূর্ণ

team1.put("United", 5);

team1.put(5, "United");

আপনি যদি ব্যবহার করেন team1.get("United") = 5এবংteam1.get(5) = "United"

তবে আপনি জোড়গুলির মধ্যে যে কোনও একটিতে কিছু নির্দিষ্ট পদ্ধতি ব্যবহার করেন যদি আপনি অন্য মানচিত্র তৈরি করেন তবে আমি আরও ভাল হতে পারি:

private Map<String, Integer> team1 = new HashMap<String, Integer>();

private Map<Integer, String> team1Keys = new HashMap<Integer, String>();

এবং তারপর

team1.put("United", 5);

team1Keys.put(5, "United");

এবং মনে রাখবেন, এটিকে সহজ রাখুন;)


-3

কী এবং এর মান পেতে

যেমন

private Map<String, Integer> team1 = new HashMap<String, Integer>();
  team1.put("United", 5);
  team1.put("Barcelona", 6);
    for (String key:team1.keySet()){
                     System.out.println("Key:" + key +" Value:" + team1.get(key)+" Count:"+Collections.frequency(team1, key));// Get Key and value and count
                }

মুদ্রণ করবে: কী: সংযুক্ত মান: 5 কী: বার্সেলোনা মান: 6

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