জাভা ক্লাস যা মানচিত্র প্রয়োগ করে এবং সন্নিবেশ ক্রম রাখে?


463

আমি জাভাতে এমন একটি শ্রেণীর সন্ধান করছি যাতে কী-মান সংযুক্তি রয়েছে তবে হ্যাশ ব্যবহার না করেই। আমি বর্তমানে যা করছি তা এখানে:

  1. একটিতে মান যুক্ত করুন Hashtable
  2. এর জন্য একটি ইেটরেটর পান Hashtable.entrySet()
  3. সমস্ত মান এবং এর মাধ্যমে আইট্রেট করুন:
    1. Map.Entryপুনরাবৃত্তির জন্য একটি পান
    2. Moduleমানের উপর ভিত্তি করে টাইপের একটি অবজেক্ট (একটি কাস্টম ক্লাস) তৈরি করুন।
    3. একটি জেপ্যানেলে ক্লাস যুক্ত করুন।
  4. প্যানেলটি দেখান।

এটির সাথে সমস্যাটি হ'ল আমি যে মানগুলি ফিরে পাই সেটির উপরে আমার নিয়ন্ত্রণ নেই, সুতরাং আমি প্রদত্ত ক্রমে মানগুলি প্রদর্শন করতে পারি না (ক্রমটিকে হার্ড-কোডিং না দিয়ে)।

আমি এর জন্য একটি ArrayListবা এটি ব্যবহার করব Vector, তবে পরে কোডে আমার Moduleপ্রদত্ত কীটির জন্য অবজেক্টটি ধরতে হবে , যা আমি একটি ArrayListবা দিয়ে করতে পারি না Vector

কেউ কি এমন কোনও ফ্রি / ওপেন সোর্স জাভা ক্লাস সম্পর্কে জানেন যা এটি করবে, বা Hashtableযখন যুক্ত হয়েছিল তার ভিত্তিতে মানগুলি পাওয়ার উপায় ?

ধন্যবাদ!


1
আপনার এন্ট্রি সেট / ম্যাপ.এন্ট্রি ব্যবহার করার দরকার নেই। আপনি কী হিসাবে এবং মানগুলিতে পুনরাবৃত্তি করতে পারবেন হ্যাশট্যাব.কিগুলি একটি গণনা হিসাবে ব্যবহার করে বা হ্যাশটবেল.কিসেট.ইটিরেটর ব্যবহার করে।
জন গার্ডনার

5
আমি শিরোনাম পরিবর্তন করার জন্য স্বাধীনতা নিয়েছিলাম, যেহেতু হ্যাশ ব্যবহার না করা আসলে সমস্যা নয়, তবে সন্নিবেশের ক্রমটি রাখা।
জোছিম সউর 23

একই প্রশ্ন হচ্ছে, জাভা ম্যাপ অর্ডার
বেসিল Bourque

উত্তর:


734

আমি একটি LinkedHashMapবা একটি পরামর্শ TreeMap। একজন LinkedHashMapযখন একটি, যাতে তারা সন্নিবেশিত হয়েছে কী রাখে TreeMapএকটি মাধ্যমে সাজানো রাখা হয় Comparatorবা প্রাকৃতিক Comparableউপাদানের ক্রম।

যেহেতু এটি উপাদানগুলিকে বাছাই করে রাখতে হবে না, LinkedHashMapবেশিরভাগ ক্ষেত্রে দ্রুত হওয়া উচিত; TreeMapহয়েছে O(log n)জন্য কর্মক্ষমতা containsKey, get, put, এবং remove, Javadocs অনুযায়ী, যখন LinkedHashMapহয় O(1)প্রত্যেকের জন্য।

যদি আপনার এপিআই যে নির্দিষ্ট অনুক্রমের আদেশের বিপরীতে কেবল অনুমানযোগ্য সাজানোর আদেশের প্রত্যাশা করে, তবে এই দুটি শ্রেণি প্রয়োগ করা ইন্টারফেসগুলি বিবেচনা করুন, NavigableMapবা SortedMap। এটি আপনাকে আপনার এপিআই-তে নির্দিষ্ট প্রয়োগগুলি ফাঁস না করার অনুমতি দেয় এবং সেই নির্দিষ্ট ক্লাসগুলির যে কোনও একটিতে স্যুইচ করতে বা পরে ইচ্ছামত সম্পূর্ণ ভিন্ন বাস্তবায়ন করতে দেয়।


2
এটি আমার পক্ষে কাজ করবে না কারণ জাভাদোক হিসাবে এটি কেবল আদেশিত মান দেয় (মানগুলির মাধ্যমে)। অর্ডার প্রাপ্ত মানচিত্রের কোনও উপায় আছে?
কোরি কেন্ডল

1
@ কোরিকেনডাল: ট্রিম্যাপ কি কাজ করে না? এটি মান দ্বারা নয়, কী দ্বারা বাছাই করার কথা।
মাইকেল ম্যাইইয়ার্স

1
আমার ভুল, আমি ভেবেছিলাম সেটগুলি অকার্যকর করা হয়েছে।
কোরি কেন্ডল

61
দয়া করে নোট করুন: একটি ট্রিম্যাপ বাছাই করা কীগুলির প্রাকৃতিক ক্রমের উপর ভিত্তি করে: "মানচিত্রটি তার কীগুলির প্রাকৃতিক ক্রম অনুসারে সাজানো হয়"। লিংকডহ্যাশম্যাপ বিজ সন্নিবেশ ক্রমের অনুসারে বাছাই করা হয়। বড় পার্থক্য!
জোপ ভ্যান রায়জ

3
@AlexR: তা একমাত্র সত্য হলে LinkedHashMap ব্যবহার করে তৈরি করা হয় বিশেষ কন্সট্রাকটর যা উদ্দেশ্যে প্রদান করা হয়। ডিফল্টরূপে, পুনরাবৃত্তি সন্নিবেশ ক্রমে।
মাইকেল ময়র্স

22

লিঙ্কডহ্যাশম্যাপ যখন মানচিত্রের কীসেট (), এন্ট্রিসেট () বা মানগুলি () এর উপর পুনরাবৃত্তি করবে তখন উপাদানগুলিকে সেগুলি ক্রমে theোকানো হয়েছিল সে অনুযায়ী ফিরবে।

Map<String, String> map = new LinkedHashMap<String, String>();

map.put("id", "1");
map.put("name", "rohan");
map.put("age", "26");

for (Map.Entry<String, String> entry : map.entrySet()) {
    System.out.println(entry.getKey() + " = " + entry.getValue());
}

এটি উপাদানগুলিকে মানচিত্রে ক্রমযুক্ত ক্রমে মুদ্রণ করবে:

id = 1
name = rohan 
age = 26 

16

যদি কোনও পরিবর্তনযোগ্য মানচিত্র আপনার প্রয়োজন অনুসারে ফিট করে তবে গুয়ারা দ্বারা পেয়ারা নামে একটি গ্রন্থাগার রয়েছে ( পেয়ারা সম্পর্কিত প্রশ্নগুলিও দেখুন )

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

ImmutableMap বস্তু পারেন মার্জিত স্ট্যাটিক সুবিধার পদ্ধতি ব্যবহার করে নির্মিত হয় () এর এবং copyOf () বা নির্মাতা বস্তু।


6

আপনি একটি Map(দ্রুত দেখার জন্য) এবং List(ক্রমের জন্য ) বজায় রাখতে পারেন তবে একটি LinkedHashMapসহজতম হতে পারে। আপনি একটি SortedMapউদাহরণও চেষ্টা করতে পারেন TreeMap, যার একটি আপনার নির্দিষ্ট করা কোনও আদেশ রয়েছে।


1

এটি ওপেনসোর্স কিনা তা আমি জানি না তবে কিছুটা গুগল করার পরে আমি অ্যারেলিস্ট ব্যবহার করে মানচিত্রের এই প্রয়োগটি পেয়েছি । এটি জাভাটি 1.5-পূর্বের বলে মনে হচ্ছে, তাই আপনি এটিকে জেনারাইজ করতে চাইতে পারেন যা সহজ হওয়া উচিত। নোট করুন যে এই বাস্তবায়নের ও (এন) অ্যাক্সেস রয়েছে তবে আপনি যদি আপনার জেপ্যানেলে কয়েকশ উইজেট যোগ না করেন তবে এটি কোনও সমস্যা হবেনা, যা আপনাকে যাইহোক করা উচিত নয়।



1

আমার যখনই সময়ের প্রাকৃতিক জিনিসগুলি প্রাকৃতিক শৃঙ্খলা বজায় রাখা দরকার তখন আমি একটি এনামম্যাপ ব্যবহার করি

কীগুলি এনাম হবে এবং আপনি যে কোনও ক্রমে সন্নিবেশ করতে পারেন তবে যখন আপনি পুনরাবৃত্তি করবেন তখন এটি এনাম ক্রমে পুনরুক্ত হবে (প্রাকৃতিক ক্রম)।

এছাড়াও এনামম্যাপ ব্যবহার করার সময় কোনও সংঘর্ষ হওয়া উচিত নয় যা আরও দক্ষ হতে পারে।

আমি সত্যিই খুঁজে পেয়েছি যে এনামম্যাপ ব্যবহার করে পরিষ্কার পাঠযোগ্য কোড তৈরি হয়। এখানে একটি উদাহরণ


1

আপনি মানচিত্রে প্রধান সন্নিবেশ ক্রমের জন্য লিংকডহ্যাশম্যাপ ব্যবহার করতে পারেন

জাভা লিঙ্কডহ্যাশম্যাপ ক্লাস সম্পর্কে গুরুত্বপূর্ণ বিষয়গুলি হ'ল:

  1. এটিতে ইউনিক উপাদান রয়েছে contains
  2. একটি লিঙ্কডহ্যাশম্যাপে কী 3.. ভিত্তিক মান রয়েছে এটির একটি নাল কী এবং একাধিক নাল মান থাকতে পারে। 4. এটি হ্যাশম্যাপ পরিবর্তে সন্নিবেশ ক্রম বজায় রাখার মতোই

    public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V> 

তবে আপনি যদি মানচিত্রে ব্যবহারকারী-সংজ্ঞায়িত অবজেক্ট বা কোনও আদিম ডেটা টাইপ কী ব্যবহার করে মানগুলি সাজান করতে চান তবে আপনার আরও তথ্যের জন্য ট্রিম্যাপ ব্যবহার করা উচিত , এই লিঙ্কটিটি দেখুন


0

হয় আপনি ব্যবহার করতে পারেন LinkedHashMap<K, V>বা আপনি নিজের নিজস্ব কাস্টম্যাপ প্রয়োগ করতে পারেন যা সন্নিবেশ ক্রম বজায় রাখে।

CustomHashMapনিম্নলিখিত বৈশিষ্ট্যগুলি সহ আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন :

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

HashMapবনাম LinkedHashMapবনামCustomHashMap

interface CustomMap<K, V> extends Map<K, V> {
    public boolean insertionRule(K key, V value);
}

@SuppressWarnings({ "rawtypes", "unchecked" })
public class CustomHashMap<K, V> implements CustomMap<K, V> {
    private Map<K, V> entryMap;
    // SET: Adds the specified element to this set if it is not already present.
    private Set<K> entrySet;

    public CustomHashMap() {
        super();
        entryMap = new LinkedHashMap<K, V>();
        entrySet = new HashSet();
    }

    @Override
    public boolean insertionRule(K key, V value) {
        // KEY as null and EMPTY String is not allowed.
        if (key == null || (key instanceof String && ((String) key).trim().equals("") ) ) {
            return false;
        }

        // If key already available then, we are not overriding its value.
        if (entrySet.contains(key)) { // Then override its value, but we are not allowing
            return false;
        } else { // Add the entry
            entrySet.add(key);
            entryMap.put(key, value);
            return true;
        }
    }
    public V put(K key, V value) {
        V oldValue = entryMap.get(key);
        insertionRule(key, value);
        return oldValue;
    }
    public void putAll(Map<? extends K, ? extends V> t) {
        for (Iterator i = t.keySet().iterator(); i.hasNext();) {
            K key = (K) i.next();
            insertionRule(key, t.get(key));
        }
    }

    public void clear() {
        entryMap.clear();
        entrySet.clear();
    }
    public boolean containsKey(Object key) {
        return entryMap.containsKey(key);
    }
    public boolean containsValue(Object value) {
        return entryMap.containsValue(value);
    }
    public Set entrySet() {
        return entryMap.entrySet();
    }
    public boolean equals(Object o) {
        return entryMap.equals(o);
    }
    public V get(Object key) {
        return entryMap.get(key);
    }
    public int hashCode() {
        return entryMap.hashCode();
    }
    public boolean isEmpty() {
        return entryMap.isEmpty();
    }
    public Set keySet() {
        return entrySet;
    }
    public V remove(Object key) {
        entrySet.remove(key);
        return entryMap.remove(key);
    }
    public int size() {
        return entryMap.size();
    }
    public Collection values() {
        return entryMap.values();
    }
}

এর ব্যবহার CustomHashMap:

public static void main(String[] args) {
    System.out.println("== LinkedHashMap ==");
    Map<Object, String> map2 = new LinkedHashMap<Object, String>();
    addData(map2);

    System.out.println("== CustomHashMap ==");
    Map<Object, String> map = new CustomHashMap<Object, String>();
    addData(map);
}
public static void addData(Map<Object, String> map) {
    map.put(null, "1");
    map.put("name", "Yash");
    map.put("1", "1 - Str");
    map.put("1", "2 - Str"); // Overriding value
    map.put("", "1"); // Empty String
    map.put(" ", "1"); // Empty String
    map.put(1, "Int");
    map.put(null, "2"); // Null

    for (Map.Entry<Object, String> entry : map.entrySet()) {
        System.out.println(entry.getKey() + " = " + entry.getValue());
    }
}

O / পি:

== LinkedHashMap == | == CustomHashMap ==
null = 2            | name = Yash
name = Yash         | 1 = 1 - Str
1 = 2 - Str         | 1 = Int
 = 1                |
  = 1               |
1 = Int             |

যদি আপনি জানেন যে কেইইগুলি স্থির হয়ে গেছে তবে আপনি এনামম্যাপ ব্যবহার করতে পারেন। বৈশিষ্ট্যগুলি / এক্সএমএল ফাইলগুলি ফর্মটি পান

গো EX:

enum ORACLE {
    IP, URL, USER_NAME, PASSWORD, DB_Name;
}

EnumMap<ORACLE, String> props = new EnumMap<ORACLE, String>(ORACLE.class);
props.put(ORACLE.IP, "127.0.0.1");
props.put(ORACLE.URL, "...");
props.put(ORACLE.USER_NAME, "Scott");
props.put(ORACLE.PASSWORD, "Tiget");
props.put(ORACLE.DB_Name, "MyDB");
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.