এক বিবৃতিতে একবারে একটি হ্যাশম্যাপে একাধিক এন্ট্রি যুক্ত করা


138

আমার একটি ধ্রুবক হাশম্যাপ শুরু করতে হবে এবং এটি একটি লাইনের বিবৃতিতে করতে চাই। এই জাতীয় অবস্থা এড়ানো:

  hashMap.put("One", new Integer(1)); // adding value into HashMap
  hashMap.put("Two", new Integer(2));      
  hashMap.put("Three", new Integer(3));

উদ্দেশ্য সি এর সাথে এটির অনুরূপ:

[NSDictionary dictionaryWithObjectsAndKeys:
@"w",[NSNumber numberWithInt:1],
@"K",[NSNumber numberWithInt:2],
@"e",[NSNumber numberWithInt:4],
@"z",[NSNumber numberWithInt:5],
@"l",[NSNumber numberWithInt:6],
nil] 

এত লোকের দিকে তাকিয়ে কীভাবে এটি করা যায় তা দেখায় এমন কোনও উদাহরণ আমি পাইনি।

উত্তর:


258

তুমি এটি করতে পারো:

Map<String, Integer> hashMap = new HashMap<String, Integer>()
{{
     put("One", 1);
     put("Two", 2);
     put("Three", 3);
}};

11
@ ব্যবহারকারী 387184 হ্যাঁ, তারা এটিকে "ডাবল ব্রেস আরম্ভকারী" বলে। : এই বিষয়ে দেখুন stackoverflow.com/questions/924285/...
Eng.Fouad

2
আমি কেবল এটি আমার কোডে রেখেছি এবং আমি এই সতর্কতা / বার্তাটি লাইনে পেয়েছি: "সিরিয়ালাইজযোগ্য ক্লাস দীর্ঘ প্রকারের স্থিতিশীল চূড়ান্ত সিরিয়াল সংস্করণ সূত্রটি ঘোষণা করে না"। আমি কি কেবল তা উপেক্ষা করতে পারি? এটার মানে কি? ধন্যবাদ
ব্যবহারকারী 387184

31
আপনার এই পদ্ধতিটি ব্যবহার করা উচিত নয়। এটা তোলে যা হয়েছে প্রত্যেক সময় যে আপনি এটি ব্যবহার, এর জন্য একটি নতুন শ্রেণী সৃষ্টি অনেক মাত্র স্পষ্টভাবে একটি মানচিত্র তৈরি করার চেয়ে খারাপ কর্মক্ষমতা। দেখুন stackoverflow.com/questions/924285/...
টিমো Türschmann

7
আমি এটিকে হ্রাস করার কারণ হ'ল কারণ এটি ব্যাখ্যা করে না যে আপনি এটি ব্যবহারের জন্য এটি একটি নতুন ক্লাস তৈরি করে। আমি মনে করি যে লোকেরা এইভাবে এটি করার ব্যবসায়ের বিষয়ে সচেতন হওয়া উচিত।
idungotnosn

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

65

আপনি গুগল পেয়ারার ইমটুটেবল ম্যাপ ব্যবহার করতে পারেন। এটি ততক্ষণ কাজ করবে যতক্ষণ আপনি পরে মানচিত্রটি পরিবর্তনের বিষয়ে চিন্তা করবেন না (আপনি এই পদ্ধতিটি ব্যবহার করে মানচিত্রটি নির্মাণের পরে .put () কল করতে পারবেন না):

import com.google.common.collect.ImmutableMap;

// For up to five entries, use .of()
Map<String, Integer> littleMap = ImmutableMap.of(
    "One", Integer.valueOf(1),
    "Two", Integer.valueOf(2),
    "Three", Integer.valueOf(3)
);

// For more than five entries, use .builder()
Map<String, Integer> bigMap = ImmutableMap.<String, Integer>builder()
    .put("One", Integer.valueOf(1))
    .put("Two", Integer.valueOf(2))
    .put("Three", Integer.valueOf(3))
    .put("Four", Integer.valueOf(4))
    .put("Five", Integer.valueOf(5))
    .put("Six", Integer.valueOf(6))
    .build();

আরো দেখুন: http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/ImmutableMap.html

কিছুটা সম্পর্কিত প্রশ্ন: মানচিত্রগুলিতে হ্যাশম্যাপের জন্য ইমম্যাটেবল ম্যাপ.ওফ () ওয়ার্কআরাউন্ড?


পেয়ারা বিশাল, একেবারে প্রয়োজনীয় না হলে আমি এটিকে আমার অ্যান্ড্রয়েড অ্যাপ্লিকেশনটির জন্য ব্যবহার করব না
এরিকন

4
সাবধান থাকুন যা কী বা মানগুলি ImmutableMapগ্রহণ করে না null
ভাদজিম

@ এরিকন প্রোগার্ড আপনাকে যে লাইব্রেরির ব্যবহার করছেন না তার কোনও অংশ বাদ দিতে দেয়।
ডিমো 414

55

জাভা 9, যেহেতু এটি ব্যবহার করা সম্ভব Map.of(...), যেমন:

Map<String, Integer> immutableMap = Map.of("One", 1, 
                                           "Two", 2, 
                                           "Three", 3);

এই মানচিত্রটি পরিবর্তনযোগ্য। আপনি যদি মানচিত্রটি পরিবর্তনযোগ্য হতে চান তবে আপনাকে যুক্ত করতে হবে:

Map<String, Integer> hashMap = new HashMap<>(immutableMap);

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


10 টি এন্ট্রি যুক্ত করার পরে এটি অদ্ভুত ত্রুটি "পদ্ধতি সমাধান করতে পারে না" ছুড়ে দেয়, এই পদ্ধতির সাথে কি এই বাগটি রয়েছে?
বিক্রমভি

2
@ ভিক্রামভি হ্যাঁ আপনি যদি ডকুমেন্টেশনটি দেখেন Map.ofতবে কেবলমাত্র 10 টি
প্রবেশিকা

8

জাভাতে কোনও মানচিত্র আক্ষরিক নেই, তাই আপনি যা চাইছেন ঠিক তা করার কোনও দুর্দান্ত উপায় নেই।

আপনার যদি সেই ধরণের সিনট্যাক্সের প্রয়োজন হয় তবে কিছু গ্রোভিকে বিবেচনা করুন যা জাভা-সামঞ্জস্যপূর্ণ এবং আপনাকে তা করতে দেয়:

def map = [name:"Gromit", likes:"cheese", id:1234]

8

জাভা in-এ মানচিত্রের কারখানার পদ্ধতিগুলিও যুক্ত রয়েছে 10 টি পর্যন্ত প্রবেশের জন্য মানচিত্রে ওভারলোডড কনস্ট্রাক্টর রয়েছে যাগুলি কী এবং মানগুলির জোড়া নেয়। উদাহরণস্বরূপ আমরা নিম্নলিখিত হিসাবে বিভিন্ন শহর এবং তাদের জনসংখ্যার (গুগল অনুসারে) একটি মানচিত্র তৈরি করতে পারি:

Map<String, Integer> cities = Map.of("Brussels", 1_139000, "Cardiff", 341_000);

মানচিত্রের জন্য ভের-আরগস কেসটি কিছুটা শক্ত, আপনার কী এবং মান উভয়ই লাগবে, তবে জাভাতে, পদ্ধতিগুলিতে দুটি ভের-আরগস প্যারামিটার থাকতে পারে না। সুতরাং সাধারণ কেস Map.Entry<K, V>অবজেক্টগুলির একটি ভের-আরগস পদ্ধতি গ্রহণ করে এবং entry()তাদেরকে স্থিতিশীল পদ্ধতি যুক্ত করে পরিচালনা করা হয়। উদাহরণ স্বরূপ:

Map<String, Integer> cities = Map.ofEntries(
    entry("Brussels", 1139000), 
    entry("Cardiff", 341000)
);

জাভা 9-তে সংগ্রহের কারখানা পদ্ধতি


দুর্দান্ত আপনি জাভা 9+ ব্যবহার করতে পারলে। এছাড়াও এই কারখানা পদ্ধতিটি অপরিবর্তনীয় মানচিত্র দেয়।
সৌরভ

6

এখানে একটি সাধারণ ক্লাস যা আপনি যা চান তা পূরণ করবে

import java.util.HashMap;

public class QuickHash extends HashMap<String,String> {
    public QuickHash(String...KeyValuePairs) {
        super(KeyValuePairs.length/2);
        for(int i=0;i<KeyValuePairs.length;i+=2)
            put(KeyValuePairs[i], KeyValuePairs[i+1]);
    }
}

এবং তারপরে এটি ব্যবহার করার জন্য

Map<String, String> Foo=QuickHash(
    "a", "1",
    "b", "2"
);

এই ফলন {a:1, b:2}


4
    boolean x;
    for (x = false, 
        map.put("One", new Integer(1)), 
        map.put("Two", new Integer(2)),      
        map.put("Three", new Integer(3)); x;);

ঘোষণাপত্রটি উপেক্ষা করা x(যা "অপ্রচারনীয় বক্তব্য" ডায়াগনস্টিক এড়াতে প্রয়োজনীয়), প্রযুক্তিগতভাবে এটি কেবল একটি বিবৃতি।


14
এটি ঘৃণ্যভাবে হ্যাকি।
মীখা সিঁড়ি

1
@ মাইকা স্টেইরিস - তবে এটি কেবল একটি বিবৃতি।
হট লিক্স

2
সত্য, তবে এটি এমন এক ধরণের কোড যা আমি কখনই উত্পাদনে হোঁচট খাওয়ার আশা করি না।
মীখা সিঁড়ি

@ মিকাহ স্টেয়ারস - আমি আরও খারাপ দেখেছি।
হট লিক্স

1
ওএমজি আমি আজ এটি অনুসন্ধান করেছি, এই কোডটি কীভাবে কাজ করে? আমি এটি পরীক্ষার জন্য কোডে যুক্ত করেছি তবে এটি অভ্যন্তরীণভাবে কীভাবে কাজ করে তা আমি বুঝতে পারি না ... :)
GOXR3PLUS

1

আপনি এই ইউটিলিটি ফাংশনটি কোনও ইউটিলিটি ক্লাসে যুক্ত করতে পারেন:

public static <K, V> Map<K, V> mapOf(Object... keyValues) {
    Map<K, V> map = new HashMap<>();

    for (int index = 0; index < keyValues.length / 2; index++) {
        map.put((K)keyValues[index * 2], (V)keyValues[index * 2 + 1]);
    }

    return map;
}

Map<Integer, String> map1 = YourClass.mapOf(1, "value1", 2, "value2");
Map<String, String> map2 = YourClass.mapOf("key1", "value1", "key2", "value2");

দ্রষ্টব্য: Java 9আপনি Map.of ব্যবহার করতে পারেন


-1

অন্য পদ্ধতির মধ্যে নিয়মিত-এক্সপ্রেশন দ্বারা একটি স্ট্রিং থেকে সমস্ত উপাদানগুলির মানগুলি বের করার জন্য বিশেষ ফাংশন রচনা করা যেতে পারে:

import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Example {
    public static void main (String[] args){
        HashMap<String,Integer> hashMapStringInteger = createHashMapStringIntegerInOneStat("'one' => '1', 'two' => '2' , 'three'=>'3'  ");

        System.out.println(hashMapStringInteger); // {one=1, two=2, three=3}
    }

    private static HashMap<String, Integer> createHashMapStringIntegerInOneStat(String str) {
        HashMap<String, Integer> returnVar = new HashMap<String, Integer>();

        String currentStr = str;
        Pattern pattern1 = Pattern.compile("^\\s*'([^']*)'\\s*=\\s*>\\s*'([^']*)'\\s*,?\\s*(.*)$");

        // Parse all elements in the given string.
        boolean thereIsMore = true;
        while (thereIsMore){
            Matcher matcher = pattern1.matcher(currentStr);
            if (matcher.find()) {
                returnVar.put(matcher.group(1),Integer.valueOf(matcher.group(2)));
                currentStr = matcher.group(3);
            }
            else{
                thereIsMore = false;
            }
        }

        // Validate that all elements in the given string were parsed properly
        if (currentStr.length() > 0){
            System.out.println("WARNING: Problematic string format. given String: " + str);
        }

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