জাভা - নতুন এন্ট্রি কীভাবে তৈরি করবেন (কী, মান)


291

আমি নতুন আইটেম একইভাবে তৈরি করতে চাই Util.Map.Entryযে কাঠামো থাকতে হবে key, value

সমস্যাটি হ'ল আমি কোনও ইনস্ট্যান্ট করতে পারি না Map.Entryকারণ এটি একটি ইন্টারফেস।

মানচিত্রের জন্য কীভাবে নতুন জেনেরিক কী / মান অবজেক্ট তৈরি করা যায় তা কি কেউ জানেন?

উত্তর:


79

আপনি কেবল Map.Entry<K, V>ইন্টারফেসটি নিজে প্রয়োগ করতে পারেন :

import java.util.Map;

final class MyEntry<K, V> implements Map.Entry<K, V> {
    private final K key;
    private V value;

    public MyEntry(K key, V value) {
        this.key = key;
        this.value = value;
    }

    @Override
    public K getKey() {
        return key;
    }

    @Override
    public V getValue() {
        return value;
    }

    @Override
    public V setValue(V value) {
        V old = this.value;
        this.value = value;
        return old;
    }
}

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

Map.Entry<String, Object> entry = new MyEntry<String, Object>("Hello", 123);
System.out.println(entry.getKey());
System.out.println(entry.getValue());

117
অবশ্যই - আমি কেবল ভাবছিলাম যে এটির বাইরে কোনও সমাধান নেই। আমি আমার কোডটি যথাসম্ভব স্ট্যান্ডার্ড করার চেষ্টা করছি ...
স্পাইডারম্যান

1
আপনি কি দয়া করে ব্যাখ্যা করতে পারেন যে মানচিত্রের কিছু বাস্তবায়ন কেন চূড়ান্ত (যেমন হ্যাশম্যাপ, কনকন্টারহ্যাশম্যাপে) কী রয়েছে তবে অন্য কিছু ট্রিমেপ, উইকহ্যাশম্যাপের মতো নয়?
একেএস

7
প্রদত্ত কোড সম্পূর্ণরূপে সঠিক যেহেতু এটি সমান এবং হ্যাশকোড খুব ওভাররাইড করে না ইন্টারফেস Map.Entry দ্বারা প্রয়োজন বোধ করা হয় যা
জন তাং Boyland

জাভা 7 আপডেট 80 হিসাবে, আমি উপরে প্রয়োগ করেছি এবং এটি কাজ করেছে ( পেস্টবিন )। অন্য কোনও পদ্ধতি ওভাররাইড করা হয়নি।
রৌপ্য

806

আছে public static class AbstractMap.SimpleEntry<K,V>Abstractনামের অংশটি আপনাকে বিভ্রান্ত করতে দেবেন না : এটি আসলে কোনও শ্রেণি নয়abstract (তবে এটি শীর্ষ স্তরের AbstractMap)।

যে এটি একটি এর staticনেস্টেড বর্গ মানে আপনি না একটি এনক্লোজিং প্রয়োজন AbstractMapএটা instantiate করার উদাহরণ হিসেবে বলা যায়, তাই এই প্রনয়ন জরিমানা ভালো কিছু:

Map.Entry<String,Integer> entry =
    new AbstractMap.SimpleEntry<String, Integer>("exmpleString", 42);

অন্য উত্তরে উল্লিখিত হিসাবে, পেয়ারাতেও আপনি ব্যবহার করতে পারেন এমন একটি সুবিধাজনক staticকারখানা পদ্ধতি রয়েছে Maps.immutableEntry


তুমি বলেছিলে:

আমি Map.Entryনিজেই ব্যবহার করতে পারি না কারণ দৃশ্যত এটি একটি পঠনযোগ্য বস্তু যা আমি নতুন ইনস্ট্যান্ট করতে পারি নাinstanceof

এটি সম্পূর্ণ সঠিক নয়। আপনি সরাসরি (যেমন সহ new) এটি ইনস্ট্যান্ট করতে পারবেন না কারণ এটি একটি interface Map.Entry


গুহাত এবং টিপ

ডকুমেন্টেশনে যেমন উল্লেখ করা হয়েছে, AbstractMap.SimpleEntryতা হ'ল @since 1.6যদি আপনি 5.0 এ আটকে থাকেন তবে তা আপনার কাছে উপলভ্য নয়।

অন্য একটি পরিচিত শ্রেণীর implements Map.Entryসন্ধানের জন্য, আপনি বাস্তবে সরাসরি জাভাদোক যেতে পারেন। থেকে জাভা 6 ভার্সন

ইন্টারফেস মানচিত্র.এন্ট্রি

সমস্ত জ্ঞাত বাস্তবায়নকারী ক্লাস :

দুর্ভাগ্যক্রমে 1.5 সংস্করণটি আপনি ব্যবহার করতে পারেন এমন কোনও পরিচিত প্রয়োগকারী শ্রেণীর তালিকা করে না, যাতে আপনি নিজের প্রয়োগ বাস্তবায়নে আটকে থাকতে পারেন।


উপরের লাইনটি আমার জন্য সংকলন ত্রুটি প্রদান করে (আমি জাভা 5, বিটিডাব্লু ব্যবহার করছি) - ত্রুটি বার্তাটি হ'ল: অ্যাবস্ট্রাকম্যাপ টাইপ করুন সিম্পলএন্ট্রি দৃশ্যমান নয় '
স্পাইডারম্যান

6
কারণ AbstractMap.SimpleEntryডকুমেন্টেশনে আপনি দেখতে পাচ্ছেন যে জাভা 6 পর্যন্ত সর্বজনীন ছিল না।
জেস্পার

ঠিক আছে, তাই সংক্ষিপ্ত আলোচনার সংক্ষিপ্তসার হিসাবে - জাভা 5-এ এর বাইরে বাইরের কোনও সমাধান নেই - এতে আমার নিজের প্রয়োগটি ব্যবহার করা উচিত।
স্পাইডারম্যান

4
দেখানোর জন্য +1 AbstractMap.SimpleEntry। আমি আপনি প্রতিদিন নতুন কিছু শিখতে অনুমান!
প্রিয়দু নিমেরে

"একটি এনকোলেসিং অ্যাবস্ট্রাকম্যাপ দৃষ্টান্ত" এ আবদ্ধ করার অর্থ কী? এনক্লোজিং কি কোনও প্রযুক্তিগত শব্দ বা জাভাতে কিছু অনুমান করছে? আমাকে গাইড করুন।
সি গ্রাফিক্স

70

থেকে শুরু করে জাভা 9, একটি নতুন উপযোগ একটি অপরিবর্তনীয় এন্ট্রি যা তৈরি করতে সক্ষম হবেন পদ্ধতি Map#entry(Object, Object)

এখানে একটি সহজ উদাহরণ:

Entry<String, String> entry = Map.entry("foo", "bar");

এটি যেমন অপরিবর্তনীয়, কলিং setValueএকটি নিক্ষেপ করবে UnsupportedOperationException। অন্যান্য সীমাবদ্ধতাগুলি সত্য যে এটি সিরিয়ালযোগ্য নয় এবং nullকী বা মানটি নিষিদ্ধ করা হয়েছে, যদি এটি আপনার পক্ষে গ্রহণযোগ্য না হয় তবে আপনার ব্যবহার AbstractMap.SimpleImmutableEntryবা AbstractMap.SimpleEntryতার পরিবর্তে আপনার প্রয়োজন হবে।

এনবি: আপনার প্রয়োজন যদি Map0 থেকে 10 (কী, মান) জোড়া দিয়ে সরাসরি একটি তৈরি করতে হয় তবে আপনি পরিবর্তে টাইপ করার পদ্ধতিগুলি ব্যবহার করতে পারেন Map.of(K key1, V value1, ...)



34

অ্যাবস্ট্রাক্টম্যাপ.সিম্পল এন্ট্রি এর উদাহরণ:

import java.util.Map; 
import java.util.AbstractMap;
import java.util.AbstractMap.SimpleEntry;

instantiate:

ArrayList<Map.Entry<Integer, Integer>> arr = 
    new ArrayList<Map.Entry<Integer, Integer>>();

সারি যুক্ত করুন:

arr.add(new AbstractMap.SimpleEntry(2, 3));
arr.add(new AbstractMap.SimpleEntry(20, 30));
arr.add(new AbstractMap.SimpleEntry(2, 4));

সারিগুলি আনুন:

System.out.println(arr.get(0).getKey());
System.out.println(arr.get(0).getValue());
System.out.println(arr.get(1).getKey());
System.out.println(arr.get(1).getValue());
System.out.println(arr.get(2).getKey());
System.out.println(arr.get(2).getValue());

মুদ্রণ করা উচিত:

2
3
20
30
2
4

এটি গ্রাফ কাঠামোর প্রান্তগুলি নির্ধারণের জন্য ভাল good আপনার মাথার নিউরনের মধ্যে থাকাগুলির মতো।


18

আপনি আসলে সাথে যেতে পারেন: Map.Entry<String, String> en= Maps.immutableEntry(key, value);


এটি দরকারী। github.com/google/guava গুয়ারা গুগলের মূল জাভা লাইব্রেরির একটি সেট যা নতুন সংগ্রহের ধরণের (যেমন মাল্টিম্যাপ এবং মাল্টিসেট), অপরিবর্তনীয় সংগ্রহ, একটি গ্রাফ লাইব্রেরি, এবং একযোগের জন্য ইউটিলিটিস, আই / ও, হ্যাশিং, ক্যাশে, আদিম, স্ট্রিং এবং আরও অনেক কিছু! এটি গুগলের মধ্যে বেশিরভাগ জাভা প্রকল্পগুলিতে ব্যাপকভাবে ব্যবহৃত হয় এবং অন্যান্য অনেক সংস্থাগুলির দ্বারাও এটি ব্যাপকভাবে ব্যবহৃত হয়।
ল্যাঙ্গুয়াগুয়াং

13

কেন Map.Entry? আমি অনুমান করি যে কী-মূল্যের জুটির মতো কিছু এই ক্ষেত্রে উপযুক্ত।

ব্যবহার করুন java.util.AbstractMap.SimpleImmutableEntryবাjava.util.AbstractMap.SimpleEntry


6

org.apache.commons.lang3.tuple.Pairপ্রয়োগ java.util.Map.Entryএবং একক ব্যবহার করা যেতে পারে।

অন্যরা যেমন উল্লেখ করেছেন পেয়ারা com.google.common.collect.Maps.immutableEntry(K, V)কৌতুকটি করে।

আমি Pairএর সাবলীল Pair.of(L, R)সিনট্যাক্সের জন্য পছন্দ করি ।


2
আমি কি ImmutablePairপরিবর্তে পরামর্শ দিতে পারি?
বেলুচিন

আমি সত্যিই org.apache.commons.lang3.tuple.Pair ক্লাসটি পছন্দ করি, এটি দুর্দান্ত!
লরেন্স অপ 'টি জ্যান্ডট

আমি কেবল এটির পক্ষে পছন্দ করি না এটি এটি বাম, ডান, কী, মান যেখানে বাম = কী এবং ডান = মানতে ক্রমিক হয়। সিরিয়ালযুক্ত স্ট্রিংয়ের মাত্র 2 অতিরিক্ত অকেজো (সম্ভবত) মান।
বিক্রত গোয়েল

4

আমি জেনেরিক জোড় ক্লাসটি সংজ্ঞায়িত করেছি যা আমি সব সময় ব্যবহার করি। এটা দুর্দান্ত। বোনাস হিসাবে, একটি স্ট্যাটিক কারখানার পদ্ধতি (Pair.create) সংজ্ঞায়িত করে আমাকে কেবল টাইপ আর্গুমেন্টটি প্রায় অর্ধেকবার লিখতে হবে।

public class Pair<A, B> {

    private A component1;
    private B component2;

    public Pair() {
            super();
    }

    public Pair(A component1, B component2) {
            this.component1 = component1;
            this.component2 = component2;
    }

    public A fst() {
            return component1;
    }

    public void setComponent1(A component1) {
            this.component1 = component1;
    }

    public B snd() {
            return component2;
    }

    public void setComponent2(B component2) {
            this.component2 = component2;
    }

    @Override
    public String toString() {
            return "<" + component1 + "," + component2 + ">";
    }

    @Override
    public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result
                            + ((component1 == null) ? 0 : component1.hashCode());
            result = prime * result
                            + ((component2 == null) ? 0 : component2.hashCode());
            return result;
    }

    @Override
    public boolean equals(Object obj) {
            if (this == obj)
                    return true;
            if (obj == null)
                    return false;
            if (getClass() != obj.getClass())
                    return false;
            final Pair<?, ?> other = (Pair<?, ?>) obj;
            if (component1 == null) {
                    if (other.component1 != null)
                            return false;
            } else if (!component1.equals(other.component1))
                    return false;
            if (component2 == null) {
                    if (other.component2 != null)
                            return false;
            } else if (!component2.equals(other.component2))
                    return false;
            return true;
    }

    public static <A, B> Pair<A, B> create(A component1, B component2) {
            return new Pair<A, B>(component1, component2);
    }

}

1
দুঃখিত, আমি অন্যান্য মন্তব্যগুলি পড়ার আগে এটি পোস্ট করেছি। দেখে মনে হচ্ছে আপনি এমন কিছু চান যা স্ট্যান্ডার্ড লিবে অন্তর্ভুক্ত ...
নেলস বেকম্যান

2
গুগল পেয়ারা কেন Pairবাস্তবায়নকে খারাপ জিনিস বলে একটি ভাল পয়েন্ট দেয় । উত্স
ইনগো বার্ক

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