পুনরাবৃত্তি না করে হ্যাশম্যাপ থেকে কীভাবে একটি প্রবেশ করবেন get


172

Entry<K,V>কী না জানা থাকলে, পুনরাবৃত্তি না করেই হ্যাশম্যাপ থেকে কেবল একটি প্রাপ্তির কি সুন্দর উপায় আছে ?

প্রবেশের প্রবেশের ক্রমটি যেমন গুরুত্বপূর্ণ নয়, আমরা কি তেমন কিছু বলতে পারি

hashMapObject.get(zeroth_index);

যদিও আমি সচেতন যে সূচি পদ্ধতিতে এ জাতীয় কোনও উপস্থিতি নেই।

যদি আমি নীচে উল্লিখিত পদ্ধতির চেষ্টা করে দেখি তবে এটির জন্য হ্যাশম্যাপের সমস্ত প্রবেশ সেটটি পেতে হবে

for(Map.Entry<String, String> entry : MapObj.entrySet()) {
    return entry;
}

পরামর্শ স্বাগত জানাই।

সম্পাদনা: প্রয়োজনীয়তা পূরণের জন্য দয়া করে অন্য কোনও ডেটা স্ট্রাকচারের পরামর্শ দিন।

উত্তর:


93

জেস্পারের উত্তর ভাল। অন্য একটি সমাধান হ'ল ট্রি ম্যাপ ব্যবহার করা (আপনি অন্যান্য ডেটা স্ট্রাকচারের জন্য বলেছেন)।

TreeMap<String, String> myMap = new TreeMap<String, String>();
String first = myMap.firstEntry().getValue();
String firstOther = myMap.get(myMap.firstKey());

ট্রি ম্যাপের ওভারহেড রয়েছে তাই হ্যাশম্যাপ দ্রুত, তবে বিকল্প সমাধানের উদাহরণ হিসাবে।


বা সমকালীন স্কিপলিস্টম্যাপ
স্টিফেন ডেন

কোনও কারণে, firstEntry()পদ্ধতিটি ইন্টারফেসে সংজ্ঞায়িত করা হয়নি SortedMapতবে কেবল TreeMapএবং এর মধ্যে রয়েছে ConcurrentSkipListMap:(
জানকো

1
ফার্স্টইন্ট্রি () નેভিগিয়েবলম্যাপ ইন্টারফেসে সংজ্ঞায়িত করা হয়েছে।
প্রতি lstlund

আহ, ধন্যবাদ, আমি কেবল তাকিয়েছিলাম SortedMapকারণ এটির firstKey()পদ্ধতি ছিল ।
জাঙ্কো

251

মানচিত্রগুলি অর্ডার করা হয়নি, সুতরাং 'প্রথম প্রবেশ' হিসাবে কোনও জিনিস নেই এবং এ কারণেই Map(বা HashMap) -র কোনও গেট-বাই-ইনডেক্স পদ্ধতি নেই ।

আপনি এটি করতে পারেন:

Map<String, String> map = ...;  // wherever you get this from

// Get the first entry that the iterator returns
Map.Entry<String, String> entry = map.entrySet().iterator().next();

(দ্রষ্টব্য: বাদ দেওয়া একটি খালি মানচিত্রের জন্য চেক করা)।

আপনার কোড মানচিত্রে সমস্ত এন্ট্রি পাবে না, এটি খুঁজে পাওয়া প্রথম এন্ট্রি সহ সঙ্গে সঙ্গে তা ফিরে আসে (এবং লুপটি ভেঙে যায়)।

এই প্রথম উপাদানটির কী এবং মানটি মুদ্রণ করতে:

System.out.println("Key: "+entry.getKey()+", Value: "+entry.getValue());

দ্রষ্টব্য: কল করার iterator()অর্থ এই নয় যে আপনি পুরো মানচিত্রের উপরে পুনরাবৃত্তি করছেন।


3
কেবলমাত্র একটি পার্শ্ব নোট: LinkedHashMapকীগুলি সেগুলি orderোকানো হয়েছিল সেই ক্রমে রাখে।
ম্যাথিউউ

2
হ্যাঁ, সাধারণভাবে মানচিত্রগুলি অর্ডার করা হয় না তবে কিছু Mapবাস্তবায়ন যেমন LinkedHashMapএবং এর TreeMapকোনও সংজ্ঞায়িত আদেশ থাকে। ( HashMapনা)
জেস্পার

1
নির্বাচিত উত্তরের চেয়ে উত্তম উত্তর - যেহেতু নির্বাচিত উত্তরটি ট্রি ম্যাপ ব্যবহার করে যা কীটি তুলনামূলক টাইপের প্রত্যাশা করে।
ইয়াজাদ

28

আমার ধারণা, পুনরাবৃত্তির সহজ সমাধান হতে পারে।

return hashMapObject.entrySet().iterator().next();

আরেকটি সমাধান (সুন্দর নয়):

return new ArrayList(hashMapObject.entrySet()).get(0);

অথবা এখনও (আরও ভাল নয়):

return hashMapObject.entrySet().toArray()[0];

7
দ্বিতীয় বা তৃতীয় সংস্করণটি ব্যবহার করার কোনও কারণ নেই। প্রথমটি পুরোপুরি ঠিক আছে, অন্য দুটি কিছুই না করে অ্যারে / তালিকা সরবরাহ করে প্রচুর সময় নষ্ট করে।
জোচিম সউর 13

4
আমি সম্মত, অতএব "সুন্দর নয়" মন্তব্যসমূহ ;-)
ক্যাডারিয়ান

14

মানগুলি পান, এটিকে অ্যারেতে রূপান্তর করুন, অ্যারের প্রথম উপাদানটি পান:

map.values().toArray()[0]

ডব্লিউ


8

আপনি কেন entrySet()এটি কল করা এড়াতে চান তা সাধারণত তার নিজস্ব প্রসঙ্গের সাথে পুরোপুরি নতুন অবজেক্ট তৈরি করে না , বরং কেবল একটি ফ্যাসাদ অবজেক্ট সরবরাহ করে। সোজা কথা entrySet()বলা একটি দুর্দান্ত সস্তা অপারেশন।



6

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

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@SuppressWarnings("unchecked")
public class IndexedMap extends HashMap {

    private List<Object> keyIndex;

    public IndexedMap() {
        keyIndex = new ArrayList<Object>();
    }

    /**
     * Returns the key at the specified position in this Map's keyIndex.
     * 
     * @param index
     *            index of the element to return
     * @return the element at the specified position in this list
     * @throws IndexOutOfBoundsException
     *             if the index is out of range (index < 0 || index >= size())
     */
    public Object get(int index) {
        return keyIndex.get(index);
    }

    @Override
    public Object put(Object key, Object value) {

        addKeyToIndex(key);
        return super.put(key, value);
    }

    @Override
    public void putAll(Map source) {

        for (Object key : source.keySet()) {
            addKeyToIndex(key);
        }
        super.putAll(source);
    }

    private void addKeyToIndex(Object key) {

        if (!keyIndex.contains(key)) {
            keyIndex.add(key);
        }
    }

    @Override
    public Object remove(Object key) {

        keyIndex.remove(key);
        return super.remove(key);
    }
}

সম্পাদনা: আমি ইচ্ছাকৃতভাবে এর জেনেরিক দিকটি আবিষ্কার করি নি ...


4

"পুনরাবৃত্তি না করে" বলতে কী বোঝ?

আপনি ব্যবহার করতে পারেন map.entrySet().iterator().next()এবং আপনি মানচিত্রের মাধ্যমে পুনরাবৃত্তি করবেন না ("প্রতিটি বস্তুর স্পর্শ করার অর্থ")। আপনি Entry<K, V>যদিও কোনও পুনরুক্তি ব্যবহার না করে একটি ধরে রাখতে পারবেন না । এর Javadoc Map.Entry বলেছেন:

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

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


4
import java.util.*;

public class Friday {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<String, Integer>();

        map.put("code", 10);
        map.put("to", 11);
        map.put("joy", 12);

        if (! map.isEmpty()) {
            Map.Entry<String, Integer> entry = map.entrySet().iterator().next();
            System.out.println(entry);
        }
    }
}

এই পদ্ধতির কাজ হয় না কারণ আপনি হ্যাশম্যাপ ব্যবহার করেছেন। আমি ধরে নিয়েছি লিঙ্কডহ্যাশম্যাপ ব্যবহার করা এই ক্ষেত্রে সঠিক সমাধান হবে।


1
লিংকডহ্যাশম্যাপে কী পদ্ধতি রয়েছে যা লিঙ্কডহ্যাশম্যাপকে কাজ করে, এই কোডটি করে না?
এসএল বার্থ - মনিকা

3

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

import java.util.*;

public class Friday {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<String, Integer>();

        map.put("code", 10);
        map.put("to", 11);
        map.put("joy", 12);

        if (! map.isEmpty()) {
            Map.Entry<String, Integer> entry = map.entrySet().iterator().next();
            System.out.println(entry);
        }
    }
}

2

একই জিনিসটির সন্ধানে এখানে হোঁচট খেয়েছি ... আমি তখন পেয়ারা লাইব্রেরিIterables থেকে ক্লাসটি মনে করি ।

উপাদান "প্রথম" পেতে: Iterables.getFirst( someMap.values(), null );
মূলত এটির মতোই Map.values().iterator().next()হয় তবে মানচিত্রে কোনও কিছুই না থাকলে আপনাকে কোনও ডিফল্ট নির্দিষ্ট করতে দেয় (এই ক্ষেত্রে নাল)।

Iterables.getLast( someMap.values(), null ); মানচিত্রে শেষ উপাদানটি প্রদান করে।

Iterables.get( someMap.values(), 7, null ); যদি উপস্থিত থাকে তবে মানচিত্রে 7th ম উপাদানটি প্রদান করে, অন্যথায় একটি ডিফল্ট মান (এই ক্ষেত্রে নাল)।

মনে রাখবেন যে হ্যাশম্যাপগুলি অর্ডার করা হয়নি ... সুতরাং Iterables.getFirstআপনি সেখানে প্রথম যে আইটেমটি টস করেছিলেন তা ফেরত প্রত্যাশা করবেন না ... একইভাবে Iterables.getLast সম্ভবত পেতে দরকারী একটি যদিও ম্যাপ মান।

কেবল এটির জন্য পেয়ারা লাইব্রেরি যুক্ত করা উপযুক্ত নাও হতে পারে তবে আপনি যদি সেই লাইব্রেরির মধ্যে অন্য কয়েকটি শীতল উপযোগিতা ব্যবহার করছেন ...


1

আপনার সম্পাদনা অনুসরণ করুন, এখানে আমার পরামর্শ:

আপনার যদি কেবল একটি প্রবেশ থাকে তবে আপনি মানচিত্রটিকে দ্বৈত অবজেক্ট দ্বারা প্রতিস্থাপন করতে পারেন। ধরণের উপর নির্ভর করে এবং আপনার পছন্দসমূহ:

  • একটি অ্যারে (2 মান, কী এবং মান)
  • দুটি বৈশিষ্ট্য সহ একটি সাধারণ অবজেক্ট

0
map<string,string>m;
auto it=m.begin();//get iterator to the first element of map(m)
return m->first;//return first string(1st string in map<string,string>m)
//Incase you want the second string 
//you can use return m->second(2st string in map<string,string>m)
//if you want to iterate the whole map you can use loop
for(auto it:m)//m is a map
   cout<<it->first<<endl;

4
এই কোডটি প্রশ্নের উত্তর দিতে পারে, কেন এবং / অথবা এই কোডটির প্রশ্নের উত্তর কীভাবে তার দীর্ঘমেয়াদী মানকে উন্নত করে সে সম্পর্কে অতিরিক্ত প্রসঙ্গ সরবরাহ করে।
অ্যালেক্স রিয়াবভ

1
হ্যাঁ, দয়া করে আপনার কোড সহ কিছু ব্যাখ্যা যুক্ত করুন।
জেকদেব

-3

আমি উত্তর পেয়েছি: (এটি সহজ)

একটি অ্যারেলিস্ট নিন তারপরে এটি কাস্ট করুন এবং অ্যারেলিস্টের আকারটি সন্ধান করুন। এটা এখানে :

    ArrayList count = new ArrayList();
    count=(ArrayList) maptabcolname.get("k1"); //here "k1" is Key
    System.out.println("number of elements="+count.size());

এটি আকার প্রদর্শন করবে। (পরামর্শ দিন)। ইহা কাজ করছে.


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