জাভাতে মানচিত্রকে তালিকায় রূপান্তর করবেন কীভাবে?


674

সবচেয়ে ভালো উপায় একটি রূপান্তর করতে কি Map<key,value>একটি থেকে List<value>? সমস্ত মানগুলির উপরে কেবল পুনরাবৃত্তি করুন এবং সেগুলি একটি তালিকায় ?োকান বা আমি কি কিছু উপেক্ষা করছি?


1
আমি মনে করি যদি মানচিত্রকে তালিকায় রূপান্তর করতে হয় তবে এটি ভাল মডেল নয়। একজনকে কোডটি এমনভাবে লিখতে হবে যাতে এই পরিস্থিতিটি না ঘটে।
বাগগুলি

উত্তর:


1299
List<Value> list = new ArrayList<Value>(map.values());

অভিমানী:

Map<Key,Value> map;

7
ধন্যবাদ! আমি থেকে কাস্ট করার অভিমানী ছিল Collectionথেকে Listকাজ করবে।
এজেগেস করুন

1
আমার সন্দেহ হয় যে এটি কাজ করে না তার কারণ হ'ল সংগ্রহগুলি মূল্যের () দ্বারা ফেরত দেওয়া অন্তর্নিহিত মানচিত্রের উপর নির্ভরশীল; পরিবর্তে একটি অনুলিপি কন্সট্রাক্টর কল করে আপনি স্টোরেজ বরাদ্দ করেন এবং মানগুলি সেই স্টোরেজে অনুলিপি করেন, এভাবে সংযোগটি ভেঙে দেয় ...
শেল্ডন আর

4
আমাদের যদি লিংকডহ্যাশম্যাপ থাকে - আদেশটি কি একই রকম থাকবে?

1
@ ব্যবহারকারী2022068 হ্যাঁ, লিংকডহ্যাশম্যাপের সাথে অর্ডার সংরক্ষণ করা উচিত।
SusanW

1
@SheldonR। হ্যাঁ - সংগ্রহগুলি ফিরে এসেছে keySet()এবং values()সাধারণত শিম বস্তু যা অন্তর্নিহিত কাঠামোর একটি সেট বা সংগ্রহ দৃশ্য দেয় ( keySet()কোনও ডুপকে জোর দেওয়ার জন্য একটি সেট দেয়)। কারণ values(), প্রত্যাবর্তিত বস্তুটি একটি হতে পারে Listতবে প্রায়শই তা হয় না। একটি সত্যিকারের তালিকা তৈরি করা, যেমন আপনি বলেছেন, লিঙ্কটি ভেঙে যায় যার অর্থ আপনি আর মূল ম্যাপের উপর নির্ভরশীল নন। যদিও কখনও কখনও, আপনার কেবলমাত্র একটি তালিকা প্রয়োজন কারণ কিছু এপিআইয়ের একটি প্রয়োজন - এমন একটি নিয়মকে আরও জোরদার করা যে কোনও ভাল এপিআইয়ের সাথে এটির সর্বাধিক বিমূর্ত ইন্টারফেসের প্রয়োজন হয় ...
SusanW

137

এখানে সমস্যাটি হ'ল Mapদুটি মান (একটি কী এবং মান) রয়েছে যখন Listএকটির মধ্যে কেবল একটির মান (একটি উপাদান) থাকে।

অতএব, সবচেয়ে ভাল যেটি করা যায় তা হ'ল হয় Listকী বা মানগুলি পাওয়া। (যদি না আমরা কী / মান জোড় ধরে রাখতে একটি মোড়ক তৈরি করি)।

বলুন আমাদের একটি রয়েছে Map:

Map<String, String> m = new HashMap<String, String>();
m.put("Hello", "World");
m.put("Apple", "3.14");
m.put("Another", "Element");

হিসেবে কী Listএকটি নতুন তৈরি করে প্রাপ্ত করা যাবে ArrayListA থেকে Setফিরিয়ে দেওয়া Map.keySetপদ্ধতি:

List<String> list = new ArrayList<String>(m.keySet());

যদিও একটি হিসাবে মানগুলি পদ্ধতিটি দ্বারা ফেরত থেকে একটি Listনতুন তৈরি করা যায় :ArrayListCollectionMap.values

List<String> list = new ArrayList<String>(m.values());

Listকীগুলির কী পাওয়ার ফলাফল :

আপেল
অন্য
হ্যালো

Listমানগুলির প্রাপ্তির ফলাফল :

3.14
উপাদান
বিশ্ব

3
এটা লক্ষনীয় যে পদ্ধতি দ্বারা ফিরে মূল্যবোধের অর্ডার না সংজ্ঞায়িত এবং জন্য HashMapএবং অনুরূপ আন-সাজানো Mapবাস্তবায়নের এটা কার্যকরভাবে র্যান্ডম হতে হবে।
জোচিম সৌর

1
হ্যাঁ, আপনার এটি জানতে হবে যে এটি একটি লিংকডহ্যাশম্যাপ বা এই জাতীয় কিছু। মূল প্রশ্নের সাথে সমস্যাটি হ'ল প্রশ্নটি ভুল হয় না, তার জন্য এটি সম্পাদনা দরকার। প্রশ্নটি মানচিত্রকে একটি তালিকায় রূপান্তর করার নয়, বরং মানচিত্রের মানগুলি কীভাবে তালিকা হিসাবে পাবেন তা নয়। পদ্ধতির মানগুলি আপনাকে একটি সংগ্রহ দেয় তবে একটি তালিকা নয়, এবং তাই একটি পরিষ্কার ছোট্ট কৌশলটির প্রয়োজন।
ডেমোঙ্গোলেম

আমি মনে করি আপনি @ এম0les কী বলে আপনার উত্তরটিতে যুক্ত করতে পারেন: যে আপনি কোনওভাবে সোর্টার্ড ম্যাপের "মাধ্যমে" যেতে হবে। হয় কংক্রিট सॉোর্টড ম্যাপ বাস্তবায়ন (যেমন ট্রিম্যাপ) দিয়ে শুরু করুন বা আপনার ইনপুট মানচিত্রটিকে তালিকায় রূপান্তরিত করার আগে একটি সাজানো মানচিত্রে সন্নিবেশ করান
Ignacio Rubio

41

জাভা 8 স্ট্রিমস এপিআই ব্যবহার করে।

List<Value> values = map.values().stream().collect(Collectors.toList());

8
আমি গৃহীত, নির্ধারক-ভিত্তিক উত্তর পছন্দ করি। কোড সরলকরণের জন্য স্ট্রিমগুলি হওয়া উচিত।
হারুন

1
@ অ্যারন হ্যাঁ, মানচিত্রের কাছ থেকে মানগুলির তালিকা পাওয়ার কাজটি সহজ বলে মনে হচ্ছে। তবে আপনি যদি কোনও কোডবেজে স্ট্রিমগুলি এক্সটেনসিভলি ব্যবহার করছেন তবে ধারাবাহিক থাকাই ভাল।
মতেজ কোর্মুথ

1
আমি যখন এটি ব্যবহার করি তখন আমি একটি ত্রুটি পেতে থাকি যদি আমি প্রচুর পরিমাণে ডেটা আনছি ..জ্যাড.উটি.স্ট্রিমে.ড্রেড লুপিং করছে ed রেডুওপস $ 3.মেকসিংক (অজানা উত্স)। থ্রেডগুলি যদি অসীমভাবে লুপ হয় তবে সিপিইউ খরচ বাড়তে শুরু করবে। লুপিং থ্রেডস স্ট্যাকের ট্রেসটি নীচে দেওয়া হয়েছে, এটি পরীক্ষা করুন
গণেশ গিরি

24

map.entrySet()Map.Entryকী এবং মান উভয় সমন্বিত বস্তুর সংকলন দেয় । এরপরে আপনি এটিকে আপনার পছন্দ মতো যে কোনও সংগ্রহ সামগ্রীতে রূপান্তর করতে পারেন new ArrayList(map.entrySet());


23

একটি তালিকা কি?

ধরে mapনেওয়া আপনার উদাহরণMap

  • map.values()Collectionমানচিত্রের সমস্ত মান সহ একটি ফিরিয়ে দেবে ।
  • map.keySet()Setমানচিত্রের সমস্ত কী ব্যবহার করে ফিরিয়ে দেবে ।

14

আমি অনুমান আপনি মান অন্তর্ভুক্ত রূপান্তর করতে চান Mapএকটি থেকে list? ইন্টারফেসের values()পদ্ধতিটি কল করা সবচেয়ে সহজ MapCollectionএটিতে থাকা মানের অবজেক্টগুলিকে ফিরিয়ে দেবে Map

নোট করুন যে Collectionএটি Mapঅবজেক্টটির দ্বারা সমর্থনপ্রাপ্ত এবং অবজেক্টে যে কোনও পরিবর্তন Mapএখানে প্রতিফলিত হবে। সুতরাং আপনি যদি কোনও পৃথক অনুলিপি চান যা আপনার Mapঅবজেক্টের সাথে আবদ্ধ নয় , কেবল নীচের Listমত ArrayListমানটি পাস করার মতো একটি নতুন অবজেক্ট তৈরি করুন Collection

ArrayList<String> list = new ArrayList<String>(map.values());

6

আপনি এটি এইভাবে করতে পারেন

List<Value> list = new ArrayList<Value>(map.values());

1
ওপিতে কীভাবে তালিকা <মান> এ রূপান্তর করা যায় সে সম্পর্কে জিজ্ঞাসা করুন। উত্তর সরবরাহ করার সময় প্রস্তাবিত সমাধান সহ একটি ভাল বিবরণ অন্তর্ভুক্ত করা ভাল। এই প্রশ্নের উত্তর ইতিমধ্যে গৃহীত হয়েছে।
HaveNoDisplayName

5

আপনি যদি ফলাফলের মানগুলি ইনপুটটির List<Value>কী- অর্ডারে থাকে তা নিশ্চিত করতে চান তবে আপনাকে কোনওভাবে Map<Key, Value>"যেতে হবে" needSortedMap

উভয় ক্ষেত্রেই শুরু একটি কংক্রিট সঙ্গে SortedMapবাস্তবায়ন (যেমন TreeMap) অথবা আপনার ইনপুট সন্নিবেশ Mapএকটি মধ্যে SortedMapযে রূপান্তর করার আগে List। উদাহরণ:

Map<Key,Value> map;
List<Value> list = new ArrayList<Value>( new TreeMap<Key Value>( map ));

অন্যথায় আপনি Mapবাস্তবায়নের অর্ডারিংয়ের যা দেশীয় অর্ডার দেন তা পেয়ে যাবেন , যা প্রায়শই প্রাকৃতিক কী অর্ডারিং (ভিন্ন ভিন্নর জন্য চেষ্টা করুন ) Hashtableবা অন্য কিছু হতে পারে ConcurrentHashMap


5
    Map<String, Integer> map = new HashMap<String, Integer>();
    map.put("java", 20);
    map.put("C++", 45);

    Set <Entry<String, Integer>> set = map.entrySet();

    List<Entry<String, Integer>> list = new ArrayList<Entry<String, Integer>>(set);

আমাদের তালিকায় কী এবং মান জোড়া উভয় থাকতে পারে l এছাড়াও মানচিত্রের সাহায্যে কী এবং মান পেতে পারে list তালিকার উপরে পুনরাবৃত্তি করে এন্ট্রি।


4
// you can use this
List<Value> list = new ArrayList<Value>(map.values());

// or you may use 
List<Value> list = new ArrayList<Value>();
for (Map.Entry<String, String> entry : map.entrySet())
{
list.add(entry.getValue());    
}

1
"Map<String , String > map = new HapshMap<String , String>;
 map.add("one","java");
 map.add("two" ,"spring");
 Set<Entry<String,String>> set =  map.entrySet();
 List<Entry<String , String>> list = new ArrayList<Entry<String , String>>    (set);
 for(Entry<String , String> entry : list ) {
   System.out.println(entry.getKey());
   System.out.println(entry.getValue());
 } "

1

মানচিত্র থেকে মান পেতে এখানে সাধারণ পদ্ধতি।

public static <T> List<T> ValueListFromMap(HashMap<String, T> map) {
    List<T> thingList = new ArrayList<>();

    for (Map.Entry<String, T> entry : map.entrySet()) {
        thingList.add(entry.getValue());
    }

    return thingList;
}

1
HashMap<Integer, List<String>> map = new HashMap<>(); 
List<String> list = new ArrayList<String>();
list.add("Java");
list.add("Primefaces");
list.add("JSF");
map.put(1,list);
if(map != null){
    return new ArrayList<String>((Collection<? extends String>) map.values());
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.