কিভাবে সরাসরি হ্যাশম্যাপ (আক্ষরিক উপায়ে) সূচনা করবেন?


1089

জাভা হ্যাশম্যাপটি এভাবে শুরু করার কোনও উপায় আছে ?:

Map<String,String> test = 
    new HashMap<String, String>{"test":"test","test":"test"};

সঠিক বাক্য গঠন কী হবে? আমি এই সম্পর্কে কিছুই খুঁজে পাই না। এটা কি সম্ভব? আমি মানচিত্রে এমন কিছু "চূড়ান্ত / স্থিতিশীল" মান রাখার জন্য সবচেয়ে সংক্ষিপ্ত / দ্রুততম পদ্ধতির সন্ধান করছি যা কখনই পরিবর্তন হয় না এবং মানচিত্র তৈরি করার সময় আগাম পরিচিত হয়।



ঘনিষ্ঠভাবে সম্পর্কিত: stackoverflow.com/questions/507602/... (উভয় প্রশ্ন স্ট্যাটিক চূড়ান্ত মান একটি ধ্রুবক মানচিত্র initialising চলেছেন।)
Jonik



আপনি যদি apache.commons.collections ব্যবহার করেন তবে আপনি commons.apache.org/proper/commons-collections/javadocs/…
ax

উত্তর:


1340

সমস্ত সংস্করণ

যদি আপনার কেবলমাত্র একটি একক প্রবেশের প্রয়োজন হয়: আছে Collections.singletonMap("key", "value")

জাভা 9 বা তার বেশি সংস্করণের জন্য:

হ্যাঁ, এটি এখন সম্ভব। জাভা 9-তে কয়েকটি ফ্যাক্টরি পদ্ধতি যুক্ত করা হয়েছে যা মানচিত্র তৈরি সহজ করে তোলে:

// this works for up to 10 elements:
Map<String, String> test1 = Map.of(
    "a", "b",
    "c", "d"
);

// this works for any number of elements:
import static java.util.Map.entry;    
Map<String, String> test2 = Map.ofEntries(
    entry("a", "b"),
    entry("c", "d")
);

উভয়ের উপরের উদাহরণে testএবং test2মানচিত্রটি প্রকাশের বিভিন্ন উপায়ে একই হবে। Map.ofপদ্ধতি, মানচিত্র দশ উপাদান আপ জন্য সংজ্ঞায়িত যখন হয় Map.ofEntriesপদ্ধতি যেমন কোন সীমা থাকবে না।

মনে রাখবেন যে এক্ষেত্রে ফলাফলযুক্ত মানচিত্রটি একটি অপরিবর্তনীয় মানচিত্র হবে। আপনি যদি মানচিত্রটি পরিবর্তনযোগ্য হতে চান তবে আপনি এটি আবার অনুলিপি করতে পারেন, উদাহরণস্বরূপ ব্যবহার করেmutableMap = new HashMap<>(Map.of("a", "b"));

(আরো দেখুন JEP 269 এবং Javadoc )

জাভা সংস্করণ 8 পর্যন্ত:

না, আপনাকে সমস্ত উপাদান ম্যানুয়ালি যোগ করতে হবে। সিনট্যাক্সটি কিছুটা খাটো করার জন্য আপনি একটি বেনামে সাবক্লাসে একটি প্রাথমিক ব্যবহার করতে পারেন:

Map<String, String> myMap = new HashMap<String, String>() {{
        put("a", "b");
        put("c", "d");
    }};

তবে, বেনামে সাবক্লাসগুলি কিছু ক্ষেত্রে অযাচিত আচরণের পরিচয় দিতে পারে। এটি উদাহরণস্বরূপ অন্তর্ভুক্ত:

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

প্রারম্ভিককরণের জন্য একটি ফাংশন ব্যবহার আপনাকে প্রাথমিকের মধ্যে একটি মানচিত্র তৈরি করতে সক্ষম করবে, তবে বাজে পার্শ্ব-প্রতিক্রিয়াগুলি এড়িয়ে চলে:

Map<String, String> myMap = createMap();

private static Map<String, String> createMap() {
    Map<String,String> myMap = new HashMap<String,String>();
    myMap.put("a", "b");
    myMap.put("c", "d");
    return myMap;
}

3
আপনি কোনও ফাংশনে উপাদানগুলির প্রাথমিক করতে চাইলে এটি কাজ করবে না ...
মাইকেল

9
@ মিশেল: আচ্ছা হ্যাঁ, আপনি যদি কোনও ফাংশন ব্যবহার করতে চান তবে আপনি নন-ফাংশনটি ব্যবহার করতে পারবেন না। তবে আপনি কেন চান?
ইয়াঙ্কি

6
এবং ক্ষেত্রেগুলির জন্য যখন আপনার একক প্রবেশের সাথে একটি মানচিত্রের প্রয়োজন আছে Collections.singletonMap():)
স্কুইগগার

3
এখন স্থিতিশীল জাভা 9 মুক্তি পেয়েছে, আমি জাভাদোকের জন্য এই লিঙ্কটি পছন্দ করি । এবং +1 কারণ একটি কম নির্ভরতা!
ফ্রাঙ্কলিন ইউ

3
কোথায় জাভা 9 entryনথিভুক্ত করা হয়?
নভেম্বর

1029

এটি এক উপায়।

HashMap<String, String> h = new HashMap<String, String>() {{
    put("a","b");
}};

তবে আপনার সতর্কতা অবলম্বন করা উচিত এবং নিশ্চিত হওয়া উচিত যে আপনি উপরের কোডটি বুঝতে পেরেছেন (এটি হ্যাশম্যাপ থেকে উত্তরাধিকার সূত্রে একটি নতুন শ্রেণি তৈরি করে)। অতএব, আপনার এখানে আরও পড়তে হবে: http://www.c2.com/cgi/wiki?DoubleBraceInitialization , বা কেবল পেয়ারা ব্যবহার করুন:

Map<String, Integer> left = ImmutableMap.of("a", 1, "b", 2, "c", 3);

72
এটি কাজ করে তবে এটি কুৎসিত এবং এর অদৃশ্য পার্শ্ব প্রতিক্রিয়া রয়েছে যা ব্যবহারকারীরা এটি করার আগে বুঝতে হবে - উদাহরণস্বরূপ, স্পটটিতে একটি সম্পূর্ণ বেনাম শ্রেণি তৈরি করা।
jprete

96
হ্যাঁ, আমি এইভাবে সাবধানতা অবলম্বন সম্পর্কে লিখেছিলাম এবং বর্ণনার একটি লিঙ্ক দিয়েছি।
গ্রেগরি561

6
দুর্দান্ত লিঙ্ক। গ্রিনকড্ডসটেন্থরুলঅফপ্রোগ্রামিংয়ের সেই লিঙ্কটিতে উল্লেখটি পড়ার মতো।
মাইকেলোকোক

19
আপনি কি "ImmutableMap.builder.put (" k1 "," v1 ") হিসাবে যুক্ত করতে পারেন? put (" k2 "," v2 ")। বিল্ড ()" এর "পদ্ধতিটি কি সর্বোচ্চ 5 জোড়ের মধ্যে সীমাবদ্ধ?
kommradHomer


341

আপনি 3rd পার্টি লিব অনুমতি দিলে, আপনি ব্যবহার করতে পারেন পেয়ারা এর ImmutableMap অর্জন করা আক্ষরিক মত সংক্ষিপ্ততা:

Map<String, String> test = ImmutableMap.of("k1", "v1", "k2", "v2");

এটি 5 টি কী / মান জোড় পর্যন্ত কাজ করে , অন্যথায় আপনি এর নির্মাতা ব্যবহার করতে পারেন :

Map<String, String> test = ImmutableMap.<String, String>builder()
    .put("k1", "v1")
    .put("k2", "v2")
    ...
    .build();


  • দয়া করে মনে রাখবেন পেয়ারা এর ImmutableMap জাভার থেকে বাস্তবায়ন পৃথক HashMap বাস্তবায়ন (এর মধ্যে উল্লেখযোগ্য হল এটা অপরিবর্তনীয় এবং নাল কী / মান অনুমতি দেয় না)
  • আরও তথ্যের জন্য, পেয়ারার অপরিবর্তনীয় সংগ্রহের ধরণ সম্পর্কে ব্যবহারকারী গাইড নিবন্ধটি দেখুন

26
এছাড়াও, পেয়ারাটির ImmutableMap.builder.put ("কে 1", "ভি 1") রয়েছে put পুট ("কে 2", "ভি 2") build বিল্ড ();
Xetius

16
ইমটুটেবল ম্যাপ হ্যাশম্যাপের মতো নয়, কারণ এটি নাল মানগুলিতে ব্যর্থ হবে, যেখানে মানচিত্র হ্যাশম্যাপটি করবে না not
Gewith

2
এই সমস্যার মুখোমুখি হতে পারে এমন অন্যদের সহায়তা করার জন্য। আপনাকে এটির মতো একটি মানচিত্র <স্ট্রিং, স্ট্রিং> তৈরি করতে বিল্ডার টাইপ করতে হবে: মানচিত্র <স্ট্রিং, স্ট্রিং> পরীক্ষা = ইমট্যাবল ম্যাপ < put ("k2", "v2")। build ();
থিয়াগো

এই দুর্দান্ত জেনস!
গৌরব

105

এটি করার সরাসরি কোনও উপায় নেই - জাভার কোনও মানচিত্রের অক্ষর নেই (এখনও - আমি মনে করি তারা জাভা 8 এর জন্য প্রস্তাবিত হয়েছিল)।

কিছু লোক এটি পছন্দ করে:

Map<String,String> test = new HashMap<String, String>(){{
       put("test","test"); put("test","test");}};

এটি হ্যাশম্যাপের একটি বেনামে সাবক্লাস তৈরি করে, যার উদাহরণস্বরূপ এই মানগুলি রাখে। (যাইহোক, কোনও মানচিত্রে দ্বিগুণ একই মান থাকতে পারে না, আপনার দ্বিতীয় পুটটি প্রথমটিকে ওভাররাইট করবে I'll পরবর্তী উদাহরণগুলির জন্য আমি বিভিন্ন মান ব্যবহার করব))

সাধারণ উপায়টি এটি হবে (স্থানীয় ভেরিয়েবলের জন্য):

Map<String,String> test = new HashMap<String, String>();
test.put("test","test");
test.put("test1","test2");

যদি আপনার testমানচিত্রটি উদাহরণের পরিবর্তনশীল হয় তবে আরম্ভটি কোনও কনস্ট্রাক্টর বা উদাহরণের সূচনাতে রাখুন:

Map<String,String> test = new HashMap<String, String>();
{
    test.put("test","test");
    test.put("test1","test2");
}

যদি আপনার testমানচিত্রটি শ্রেণিবদ্ধ হয় তবে একটি স্ট্যাটিক ইনিশিয়ালাইজারে সূচনাটি রাখুন:

static Map<String,String> test = new HashMap<String, String>();
static {
    test.put("test","test");
    test.put("test1","test2");
}

আপনি যদি চান যে আপনার মানচিত্রটি কখনই পরিবর্তন না হয় তবে আপনার সূচনাটি শুরু করার পরে আপনার মানচিত্রটি মোড়ানো উচিত Collections.unmodifiableMap(...)। আপনি এটি স্ট্যাটিক ইনিশিয়ালাইজারেও করতে পারেন:

static Map<String,String> test;
{
    Map<String,String> temp = new HashMap<String, String>();
    temp.put("test","test");
    temp.put("test1","test2");
    test = Collections.unmodifiableMap(temp);
}

(আপনি এখন testচূড়ান্ত করতে পারেন কিনা তা আমি নিশ্চিত নই ... চেষ্টা করে দেখুন এবং এখানে প্রতিবেদন করুন))


61
Map<String,String> test = new HashMap<String, String>()
{
    {
        put(key1, value1);
        put(key2, value2);
    }
};

সহজ এবং যথাযথ. আমি মনে করি একটি বর্ধিত ভাষ্য ধারা সহ এটি সর্বোত্তম উত্তর হবে।
ooolala

15
স্মৃতি জড়িত রয়েছে যা যদিও লক্ষ করা উচিত। blog.jooq.org/2014/12/08/…
অমলগোভিনাস

1
@ অমলগোভিনাস মূলত একটি নতুন সাবক্লাস তৈরি করে আপনি HashMapএই সাবক্লাসে প্রকারের যুক্তিগুলিকে কঠোরভাবে কোডিং করছেন । আপনি কেবল তাদের সরবরাহ করলেই এটি কাজ করতে পারে। (একটি নতুন (খালি) হ্যাশম্যাপ সহ, ধরণের আর্গুমেন্টগুলি প্রাসঙ্গিক নয়))
পাওলো ইবারম্যান

1
আমি এর পরিষ্কার পরিচ্ছন্নতা পছন্দ করি তবে এটি অপ্রয়োজনীয় বেনাম
udachny

1
@hello_its_me: যেহেতু তার একই হিসাবে stackoverflow.com/a/6802512/1386911 উত্তর, শুধু বিভিন্ন বিন্যাস। এবং এই ক্ষেত্রে পাঠযোগ্যতার জন্য এই বর্ধিত বিন্যাসের কমপ্যাক্ট বিন্যাসের শীর্ষে কোনও অতিরিক্ত মান নেই।
ড্যানিয়েল হুরি

44

প্লেন জাভা 7 ক্লাস এবং ভারার্গস ব্যবহার করে একটি বিকল্প: HashMapBuilderএই পদ্ধতিটি সহ একটি শ্রেণী তৈরি করুন :

public static HashMap<String, String> build(String... data){
    HashMap<String, String> result = new HashMap<String, String>();

    if(data.length % 2 != 0) 
        throw new IllegalArgumentException("Odd number of arguments");      

    String key = null;
    Integer step = -1;

    for(String value : data){
        step++;
        switch(step % 2){
        case 0: 
            if(value == null)
                throw new IllegalArgumentException("Null key value"); 
            key = value;
            continue;
        case 1:             
            result.put(key, value);
            break;
        }
    }

    return result;
}

এই পদ্ধতিটি ব্যবহার করুন:

HashMap<String,String> data = HashMapBuilder.build("key1","value1","key2","value2");

আমি কোন উত্তর পুলিশের দ্বারা অনুপ্রাণিত লিখেছিলেন: stackoverflow.com/questions/507602/...
GeroldBroser পুনরায় জোর মনিকা

1
অ্যাপাচি ইউটিলেস সহ আরও একটি সমাধান যা আগে কখনও বর্ণিত হয় না তবে পাঠযোগ্য, পূর্ববর্তী জাভা সংস্করণগুলি ব্যবহার করে: ম্যাপুটিলস.পুটআল (নতুন হ্যাশম্যাপ <স্ট্রিং, স্ট্রিং> (), নতুন অবজেক্ট [] My "আমার কী", "আমার মান", ...
রোলিন্টোকোর

3

TL; ড

Map.of…জাভা 9 এবং তারপরে পদ্ধতিগুলি ব্যবহার করুন ।

Map< String , String > animalSounds =
    Map.of(
        "dog"  , "bark" ,   // key , value
        "cat"  , "meow" ,   // key , value
        "bird" , "chirp"    // key , value
    )
;

Map.of

জাভা 9 Map.ofআপনি যা চান ঠিক তেমনMap করতে স্ট্যাটিক পদ্ধতিগুলির একটি সিরিজ যুক্ত করেছে : আক্ষরিক সিনট্যাক্স ব্যবহার করে একটি অপরিবর্তনীয়কে ইনস্ট্যান্ট করুন

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

আসুন এই পদ্ধতিগুলিটি দেখুন, আমরা আশা করি এমন কোনও ব্যক্তির কাছে সপ্তাহের মানচিত্রের জন্য কিছু নমুনা ডেটা ব্যবহার করে day দিনটি কাজ করবে।

Person alice = new Person( "Alice" );
Person bob = new Person( "Bob" );
Person carol = new Person( "Carol" );

Map.of()

Map.ofএকটি খালি তৈরি করে Map। সংশোধনযোগ্য নয়, সুতরাং আপনি এন্ট্রি যোগ করতে পারবেন না। এ জাতীয় মানচিত্রের উদাহরণ এখানে কোনও প্রবেশপত্র খালি নেই empty

Map < DayOfWeek, Person > dailyWorkerEmpty = Map.of();

দৈনিক ওয়ার্কারএম্পটি.টো স্ট্রিং (): {}

Map.of( … )

Map.of( k , v , k , v , …)একাধিক পদ্ধতি যা 1 থেকে 10 কী-মান জোড়ায় নিয়ে যায়। এখানে দুটি এন্ট্রি উদাহরণ।

Map < DayOfWeek, Person > weekendWorker = 
        Map.of( 
            DayOfWeek.SATURDAY , alice ,     // key , value
            DayOfWeek.SUNDAY , bob           // key , value
        )
;

উইকএন্ডওয়ার্কার.টোস্ট্রিং (): U রবিবার = ব্যক্তি = নাম = 'বব'}, স্যাটুরডয় = ব্যক্তি {নাম = 'এলিস'}

Map.ofEntries( … )

Map.ofEntries( Map.Entry , … )Map.Entryইন্টারফেস প্রয়োগকারী যেকোন সংখ্যক অবজেক্ট গ্রহণ করে । জাভা সেই ইন্টারফেস প্রয়োগকারী দুটি ক্লাসকে বান্ডিল করে, একটি পরিবর্তনীয়, অন্যটি অপরিবর্তনীয়: AbstractMap.SimpleEntry, AbstractMap.SimpleImmutableEntry। তবে আমাদের কোনও কংক্রিট শ্রেণি নির্দিষ্ট করার দরকার নেই। আমাদের কেবল Map.entry( k , v )পদ্ধতিটি কল করতে হবে , আমাদের কী এবং আমাদের মানটি পাস করতে হবে এবং আমরা কিছু শ্রেণি প্রয়োগকারী Map.Entryইন্টারফেসের কোনও বস্তু ফিরে পাই ।

Map < DayOfWeek, Person > weekdayWorker = Map.ofEntries(
        Map.entry( DayOfWeek.MONDAY , alice ) ,            // Call to `Map.entry` method returns an object implementing `Map.Entry`. 
        Map.entry( DayOfWeek.TUESDAY , bob ) ,
        Map.entry( DayOfWeek.WEDNESDAY , bob ) ,
        Map.entry( DayOfWeek.THURSDAY , carol ) ,
        Map.entry( DayOfWeek.FRIDAY , carol )
);

উইকডে ওয়ার্কার.টো স্ট্রিং (): ED WEDNESDAY = ব্যক্তি {নাম = 'বব'}, শিক্ষাবৃত্তি = ব্যক্তি {নাম = 'বব'}, থার্ডসাইডে = ব্যক্তি {নাম = 'ক্যারল'}, ফ্রাইডে = ব্যক্তি {নাম = 'ক্যারল'} , সোমবার = ব্যক্তি {নাম = 'এলিস'}}

Map.copyOf

জাভা 10 পদ্ধতি যুক্ত করেছে Map.copyOf। একটি বিদ্যমান মানচিত্র পাস করুন, সেই মানচিত্রের একটি অপরিবর্তনীয় অনুলিপি ফিরে পান।

মন্তব্য

লক্ষ করুন যে, Maps- এর মাধ্যমে উত্পাদিত পুনরুক্তিকারীর অর্ডার Map.ofহয় না নিশ্চিত। এন্ট্রিগুলির একটি স্বেচ্ছাসেবী আদেশ রয়েছে। অর্ডারটি পরিবর্তিত সাপেক্ষে ডকুমেন্টেশন সতর্ক করে বলে দেখা আদেশের ভিত্তিতে কোডটি লিখবেন না।

মনে রাখবেন যে, এই সব Map.of…পদ্ধতি একটি ফিরতি Mapএর একটি অনির্দিষ্ট বর্গ । অন্তর্নিহিত কংক্রিট বর্গ এমনকি জাভার এক সংস্করণ থেকে অন্য সংস্করণে পরিবর্তিত হতে পারে। এই অজ্ঞাতনামা জাভাটিকে বিভিন্ন বাস্তবায়ন থেকে চয়ন করতে সক্ষম করে, যাই হোক না কেন সর্বোত্তমভাবে আপনার নির্দিষ্ট ডেটা ফিট করে। উদাহরণস্বরূপ, যদি আপনার কীগুলি এনাম থেকে আসে তবে জাভা EnumMapকভারগুলির নীচে একটি ব্যবহার করতে পারে ।


1

আপনি সম্ভবত আপনার নিজের Map.of(যা কেবল জাভা 9 এবং উচ্চতর ক্ষেত্রে উপলব্ধ) পদ্ধতিটি 2 সহজ উপায়ে সহজেই তৈরি করতে পারেন

এটি একটি নির্দিষ্ট পরিমাণের প্যারামিটার দিয়ে তৈরি করুন

উদাহরণ

public <K,V> Map<K,V> mapOf(K k1, V v1, K k2, V v2 /* perhaps more parameters */) {
    return new HashMap<K, V>() {{
      put(k1, v1);
      put(k2,  v2);
      // etc...
    }};
}

এটি একটি তালিকা ব্যবহার করে তৈরি করুন

নির্দিষ্ট পরামিতিগুলির জন্য প্রচুর পদ্ধতি তৈরি না করে আপনি একটি তালিকা ব্যবহার করে এটিও তৈরি করতে পারেন।

উদাহরণ

public <K, V> Map<K, V> mapOf(List<K> keys, List<V> values) {
   if(keys.size() != values.size()) {
        throw new IndexOutOfBoundsException("amount of keys and values is not equal");
    }

    return new HashMap<K, V>() {{
        IntStream.range(0, keys.size()).forEach(index -> put(keys.get(index), values.get(index)));
    }};
}

দ্রষ্টব্য এটি প্রতিটি কিছুর জন্য ব্যবহার করার পরামর্শ দেওয়া হয় না কারণ এটি প্রতিবার আপনি বেনাম বর্গ হিসাবে ব্যবহার করেন class


1

জাভা 8

সরল জাভা 8 এ আপনার Streams/Collectorsকাজটি করার সম্ভাবনাও রয়েছে ।

Map<String, String> myMap = Stream.of(
         new SimpleEntry<>("key1", "value1"),
         new SimpleEntry<>("key2", "value2"),
         new SimpleEntry<>("key3", "value3"))
        .collect(toMap(SimpleEntry::getKey, SimpleEntry::getValue));

এটি অনামী বর্গ তৈরি না করার সুবিধা রয়েছে has

নোট করুন যে আমদানিগুলি হ'ল:

import static java.util.stream.Collectors.toMap;
import java.util.AbstractMap.SimpleEntry;

অবশ্যই, অন্যান্য উত্তরে উল্লিখিত হিসাবে, জাভা 9 এর পরে আপনার একই পদ্ধতি করার সহজ উপায় রয়েছে।


0

দুর্ভাগ্যক্রমে, কীগুলি এবং মানগুলির ধরণ এক রকম না হলে ভারার্গস ব্যবহার করা খুব যুক্তিসঙ্গত নয় কারণ আপনাকে Object...সম্পূর্ণরূপে সুরক্ষা ব্যবহার করতে হবে এবং হারাতে হবে। আপনি যদি সর্বদা উদাহরণস্বরূপ তৈরি করতে চান তবে Map<String, String>অবশ্যই toMap(String... args)একটিটি সম্ভব হবে তবে কীগুলি এবং মানগুলি মিশ্রিত করা সহজ হবে এবং এটি খুব সুন্দর নয়, এবং একটি বিজোড় সংখ্যক যুক্তি অবৈধ।

আপনি হাশম্যাপের একটি সাব-ক্লাস তৈরি করতে পারেন যার মতো চেইনযোগ্য পদ্ধতি রয়েছে

public class ChainableMap<K, V> extends HashMap<K, V> {
  public ChainableMap<K, V> set(K k, V v) {
    put(k, v);
    return this;
  }
}

এবং এটি পছন্দ করুন new ChainableMap<String, Object>().set("a", 1).set("b", "foo")

আর একটি পদ্ধতি হ'ল সাধারণ বিল্ডার প্যাটার্নটি ব্যবহার করা:

public class MapBuilder<K, V> {
  private Map<K, V> mMap = new HashMap<>();

  public MapBuilder<K, V> put(K k, V v) {
    mMap.put(k, v);
    return this;
  }

  public Map<K, V> build() {
    return mMap;
  }
}

এবং এটি পছন্দ করুন new MapBuilder<String, Object>().put("a", 1).put("b", "foo").build();

তবে, সমাধানটি আমি এখন ব্যবহার করেছি এবং তারপরে ভ্যারাগস এবং Pairশ্রেণিটি ব্যবহার করব :

public class Maps {
  public static <K, V> Map<K, V> of(Pair<K, V>... pairs) {
    Map<K, V> = new HashMap<>();

    for (Pair<K, V> pair : pairs) {
      map.put(pair.first, pair.second);
    }

    return map;
  }
}

Map<String, Object> map = Maps.of(Pair.create("a", 1), Pair.create("b", "foo");

ভার্বোসটি Pair.create()আমাকে কিছুটা বিরক্ত করে, তবে এটি বেশ ভাল কাজ করে। আপনি যদি স্থির আমদানিগুলিতে কিছু মনে করেন না তবে আপনি অবশ্যই একটি সহায়ক তৈরি করতে পারেন:

public <K, V> Pair<K, V> p(K k, V v) {
  return Pair.create(k, v);
}

Map<String, Object> map = Maps.of(p("a", 1), p("b", "foo");

(পরিবর্তে এটির পরিবর্তে কারও Pairকল্পনাও করা যায় Map.Entryতবে এটি একটি ইন্টারফেসের জন্য একটি বাস্তবায়নকারী শ্রেণি এবং / অথবা সহায়ক কারখানার পদ্ধতি প্রয়োজন It's এটিও অপরিবর্তনীয় নয় এবং অন্যান্য যুক্তিও এই কাজের জন্য কার্যকর নয়))


0

আপনি জাভা 8 এ স্ট্রিম ব্যবহার করতে পারেন (এটি সেট এর বহিরাগত):

@Test
public void whenInitializeUnmodifiableSetWithDoubleBrace_containsElements() {
    Set<String> countries = Stream.of("India", "USSR", "USA")
      .collect(collectingAndThen(toSet(), Collections::unmodifiableSet));

    assertTrue(countries.contains("India"));
}

রেফ: https://www.baeldung.com/java-double-brace-initialization


0

আপনার যদি একটি মাত্র কী-মান জুড়ি রাখার প্রয়োজন হয় তবে আপনি সংগ্রহে.সেসলেটনম্যাপ (কী, মান) ব্যবহার করতে পারেন;


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