কিভাবে সংগ্রহকে তালিকায় রূপান্তর করবেন?


294

আমি TreeBidiMapথেকে ব্যবহার করছি অ্যাপাচি সংগ্রহ লাইব্রেরি । আমি মানগুলি যা মান হিসাবে এটি বাছাই করতে চাই doubles

আমার পদ্ধতিটি হ'ল Collectionমানগুলি ব্যবহার করে একটি পুনরুদ্ধার করা:

Collection coll = themap.values();

যা স্বাভাবিকভাবেই সূক্ষ্মভাবে কাজ করে।

প্রধান প্রশ্ন: আমি এখন কীভাবে রূপান্তর / কাস্ট করতে পারি তা জানতে চাই (কোনটি সঠিক তা নিশ্চিত নয়)coll একটি মধ্যে Listতাই এটি সাজানো যেতে পারে?

আমি তার পরে সাজানো Listবস্তুটির উপরে পুনরাবৃত্তি করতে চাই , যা ক্রমযুক্ত হওয়া উচিত এবং TreeBidiMap( themap) থেকে যথাযথ কীগুলি ব্যবহার করে themap.getKey(iterator.next())যেখানে পুনরুক্তি তালিকার উপরে থাকবে doubles


4
আপনি সরাসরি কোনও ধরণের सॉোর্টডম্যাপ ব্যবহার করে এই পদক্ষেপটি এড়াতে চাইতে পারেন, সুতরাং এন্ট্রিগুলি কীগুলি ব্যবহার করার প্রাকৃতিক ক্রমে থাকে। জাভার নিজস্ব ট্রিম্যাপ সোর্টার্ড ম্যাপ প্রয়োগ করে।
এক্সেল নওফ

TreeBidiMapএকটি OrderedMap, অর্ডার ঠিক করা উচিত। প্রশ্নে বাছাই করা মানগুলিতে হয়, কীগুলিতে নয়।
Vlasec

উত্তর:


470
List list = new ArrayList(coll);
Collections.sort(list);

যেমন এরেল সেগাল হালেভি নীচে বলেছেন, সংঘর্ষ যদি ইতিমধ্যে একটি তালিকা হয় তবে আপনি প্রথম ধাপটি এড়িয়ে যেতে পারেন। তবে এটি ট্রিবিডিম্যাপের অভ্যন্তরের উপর নির্ভর করবে।

List list;
if (coll instanceof List)
  list = (List)coll;
else
  list = new ArrayList(coll);

4
কেবল দুটি লক্ষ্যে আলাদা আলাদা পার্শ্ব প্রতিক্রিয়া রয়েছে তা লক্ষ করুন: সংগ্রহকে তালিকায় ফেলে দেওয়া এবং তারপরে বাছাই করা মূল সংগ্রহকেও বাছাই করবে; একটি অনুলিপি তৈরি করা হবে না।
বার্নে

এই পদ্ধতির যদি বারবার ব্যবহার করা হয় তবে কর্মক্ষমতা ব্যাপকভাবে হ্রাস পাবে। একটি সমাধানের জন্য আমার উত্তর দেখুন যা ফ্লাইটে কাজ করে, এটিতে একটি কাস্টম সংগ্রহ জড়িত।
ভ্লাস্যাক

যখন মানচিত্রের মূল্যগুলি () "অভ্যন্তরীণ শ্রেণি" সংগ্রহ প্রদান করে তখন এটি কেসটি সমাধান করে না। সংকলকটি প্রতিবেদন করে যে সংগ্রহ.সোর্ট (তালিকা <T>) সংগ্রহগুলি গ্রহণ করে না ort সাজান (তালিকা <InnerClass> তালিকা)। ।। তালিকা <InnerClass> তালিকা = map.values () প্রবাহ () সংগ্রহ (Collectors.toList ()): সমাধান এমনকি ব্যবহার ছিল
পেরেইরা

92

এর মধ্যে কিছু কাজ করা উচিত, অ্যারেলিস্ট কনস্ট্রাক্টরকে কল করা যা সংগ্রহ সংগ্রহ করে:

List theList = new ArrayList(coll);

সুন্দর এবং সহজ।
জেমস গাওরন

সবচেয়ে সহজ উত্তর, দুর্দান্ত কাজ! ধন্যবাদ।
এলরোস রোমিও

33

ইতিমধ্যে একটি তালিকা সংঘর্ষের ক্ষেত্রে পল টমলিনের উত্তর অপ্রয়োজনীয় হতে পারে বলে মনে হয়, কারণ এটি একটি নতুন তালিকা তৈরি করবে এবং সমস্ত উপাদানকে অনুলিপি করবে। যদি সংঘর্ষে অনেক এলিমেন্ট থাকে তবে এটি দীর্ঘ সময় নিতে পারে।

আমার পরামর্শটি হ'ল:

List list;
if (coll instanceof List)
  list = (List)coll;
else
  list = new ArrayList(coll);
Collections.sort(list);

21

আমি বিশ্বাস করি আপনি এটি লিখতে পারেন:

coll.stream().collect(Collectors.toList())

কাস্টিংয়ের কাছাকাছি যাওয়ার আরও ভাল উপায়
Stackee007

গ্রেট! এটি আমার মামলা সমাধান করেছে resolved আমার মানচিত্র.মূল্য () একটি "অভ্যন্তরীণ শ্রেণি" সংগ্রহ প্রদান করে। সংকলকটি জানিয়েছে যে সংগ্রহ.সোর্ট (তালিকা <T>) সংগ্রহগুলি গ্রহণ করে না ort
পেরেইরা

অ্যান্ড্রয়েডে আমার ব্যবহারের ক্ষেত্রে কাজ করেনি। ন্যূনতম এপিআই 24
আনশ সত্যদেব

8
Collections.sort( new ArrayList( coll ) );

অ্যারেলিস্ট অ্যাক্সেস করার জন্য একটি রেফারেন্স মিস করছেন?
জাচ স্ক্রিভেনা

@ জাচ: মিমিএইচएच ভাল পয়েন্ট আমি জানতাম যে এটির জন্য সিডাব্লু হিসাবে চিহ্নিত করার আমার একটি কারণ ছিল। বিটিডব্লিউ পলের উত্তরগুলি এক। আমি জানি না কেন তার কেবল আমার ইউভি আছে।
অস্কাররাইজ

4

@ কুনিগামি: আমি মনে করি আপনার পেয়ারা newArrayListপদ্ধতি সম্পর্কে ভুল হতে পারে । এটি পরীক্ষা করতে সক্ষম হয় না যে Iteable তালিকার ধরণ কিনা এবং কেবলমাত্র প্রদত্ত তালিকাটি যেমন রয়েছে তেমন ফিরিয়ে দেয়। এটি সর্বদা একটি নতুন তালিকা তৈরি করে:

@GwtCompatible(serializable = true)
public static <E> ArrayList<E> newArrayList(Iterable<? extends E> elements) {
  checkNotNull(elements); // for GWT
  // Let ArrayList's sizing logic work, if possible
  return (elements instanceof Collection)
      ? new ArrayList<E>(Collections2.cast(elements))
      : newArrayList(elements.iterator());
}

কীভাবে এটি বেশি ভোট দেওয়া হয় না? কুনিগামির উত্তরটি ভুল (এটি অন্তর্নিহিত বাস্তবায়ন সম্পর্কে যতটা অনুমান করে)।
গ্রিনিএমনি

0

আপনি যা অনুরোধ করছেন সেটি বেশ ব্যয়বহুল অপারেশন, এটি নিশ্চিত করুন যে আপনার এটি প্রায়শই করার দরকার নেই (যেমন একটি চক্র হিসাবে)।

অন্যথায়, আপনি একটি কাস্টম সংগ্রহ তৈরি করতে পারেন। আমি আপনার সাথে TreeBidiMapএবং TreeMultisetহুডের নীচে এমন একটি নিয়ে এসেছি । আপনার যা প্রয়োজন তা প্রয়োগ করুন এবং ডেটা অখণ্ডতা সম্পর্কে যত্নশীল।

class MyCustomCollection implements Map<K, V> {
    TreeBidiMap<K, V> map;
    TreeMultiset<V> multiset;
    public V put(K key, V value) {
        removeValue(map.put(key, value));
        multiset.add(value);
    }
    public boolean remove(K key) {
        removeValue(map.remove(key));
    }
    /** removes value that was removed/replaced in map */
    private removeValue(V value) {
        if (value != null) {
            multiset.remove(value);
        }
    }
    public Set keySet() {
        return map.keySet();
    }
    public Multiset values() {
        return multiset;
    }
    // many more methods to be implemented, e.g. count, isEmpty etc.
}

এইভাবে, আপনি থেকে বাছাই করে Multiset ফিরে এসেছেন values()। তবে, যদি আপনার এটি তালিকা হওয়ার প্রয়োজন হয় (যেমন আপনার অ্যারের মতো get(index)পদ্ধতি দরকার) তবে আপনাকে আরও জটিল কিছু আবিষ্কার করতে হবে।


keySet()এবং values()আসলটির প্রতি দৃষ্টিভঙ্গি রয়েছে Map, সুতরাং যখন সেগুলি সংশোধন করা হয় তখন ব্যাকিংগুলিকেও সংশোধন করা Mapদরকার, আপনার সমাধান এটি সমর্থন করে না
লিনো

-4

ওয়ান-লাইনার হিসাবে এখানে একটি উপ-অনুকূল সমাধান রয়েছে:

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