কোনও সেট <T> কে একটি তালিকায় <T> রূপান্তর করার সর্বাধিক সংক্ষিপ্ত উপায়


201

উদাহরণস্বরূপ, আমি বর্তমানে এটি করছি:

Set<String> setOfTopicAuthors = ....

List<String> list = Arrays.asList( 
    setOfTopicAuthors.toArray( new String[0] ) );

আপনি এই মারতে পারেন?


2
ব্যবহার করুন java.util.Collection: ও (0)
টিম

@ কার্ল, আমাকে একটি তৃতীয় পক্ষের ইন্টারফেসে সেটটি জমা দিতে হবে যার জন্য একটি তালিকা প্রয়োজন। @ টিম আমি আশা করি সংগ্রহটি ব্যবহারের জন্য আমি তৃতীয় পক্ষের ইন্টারফেসটি পরিবর্তন করতে পারি।
জ্যাক রেনা মেসরিন

1
আমি দেখি; কোনও অদ্ভুত বাধা বাদ দিয়ে আমি রজারের উত্তর নিয়ে যাব। যদিও আপনি যদি আবার তালিকাকে আবার ব্যবহার না করেন, আমি এটিকে foo.api (তালিকা) এর পরিবর্তে কোনও কিছুতে (যেমন, foo.api (নতুন অ্যারেলিস্ট <স্ট্রিং> (listOfTopicAuthors)) ব্যবহার করে এড়িয়ে যাব।
কার্ল

2
@ জ্যাকরেইনমেসরিন: প্রশ্নের প্রথম লাইনটি বিভ্রান্তিমূলক: প্রত্যাশিত: Set<String> setOfTopicAuthors = ....আসল:Set<String> listOfTopicAuthors = ....
রিয়েলপিকে

বা এটি করার একটি বিকল্প উপায় List<String> list = Arrays.asList(setOfTopicAuthors.toArray(String[]::new))লিঙ্কযুক্ত উত্তরে বিস্তারিত হতে পারে ।
নামান

উত্তর:


432
List<String> list = new ArrayList<String>(listOfTopicAuthors);

1
... এবং এর মাধ্যমে জাভা কোড কনভেনশনগুলি আমূলভাবে অস্বীকার করছে : oracle.com/technetwork/java/javase/docamentation/… ! :) :)
হাভার্ড গিথাস

এর পরে যখন আমি তালিকার উপাদানটি অ্যাক্সেস করার চেষ্টা করেছি তখন এটি আমার ত্রুটি দেখিয়েছিল, "java.lang.ClassCastException: java.lang.Integer java.lang.String এ কাস্ট করা যায় না" ..ডোন; টি কেন জানি না..এই সাধারণ তালিকা.ইজেট (int) এটাই ... কোন পরামর্শ?
CoDe

2
আমি জাভা in তে বিশ্বাস করি এবং তারপরে আপনি ফলনের পরামিতি টাইপ বাদ দিতে পারেন ArrayList: List<String> l = new ArrayList<>(listOfTopicAuthors); বহিরাগত লাইব্রেরি ব্যবহার না করে সর্বাধিক সংক্ষিপ্ত?
ব্রেট ডানক্যাভেজ

যদি listOfTopicAuthorsনাল হয় তবে এটি নলপয়েন্টারএক্সসেপশন ফেলে দেবে ।
w35l3y

91
List<String> l = new ArrayList<String>(listOfTopicAuthors);

4
গৃহীত উত্তর হিসাবে একই মুহুর্তে উত্তর দেওয়ার জন্য এবং ক্রেডিট না পাওয়ার জন্য। +1
জায়েফ্কে

@ অ্যাডামস্কি আমি একটি তালিকা দিয়ে শেষ করেছি যে সূচকটি 0 এর পরিবর্তে 1 এ শুরু হয়, কোন প্রতিকার?
জ্যাক

1
@ জ্যাক: অবশ্যই এটি হবে না। জাভা.ইটি.ল্ট লিস্টের জাভাডোক থেকে: "তালিকাগুলি (জাভা অ্যারেগুলির মতো) শূন্য ভিত্তিক" "
অ্যাডামস্কি

@ অ্যাডামস্কি প্রতিক্রিয়ার জন্য ধন্যবাদ। আমি জানি তালিকাগুলি শূন্য ভিত্তিক হওয়া উচিত এবং এ কারণেই এটি আমার কাছে এত অদ্ভুত। আমার সেটটিকে একটি তালিকায় রূপান্তরিত করার পরে আমি এর পূর্বাভাস, বাছাই করা ইত্যাদির উপর কোনও পুনরাবৃত্ত ক্রিয়াকলাপ সম্পাদন করতে পারি না আমি নালপয়েন্টার এক্সসেপশন পাই, তবে আমি যখন আমার তালিকাটি প্রত্যাশা করি তখন কোনও উপাদানই নাল নয়, এবং কেবলমাত্র অদ্ভুতভাবে আমি লক্ষ্য করি সূচক 1 থেকে শুরু হয় তবে যাইহোক, আমি যদি কেবল একটি সাধারণ তালিকা তৈরি করি তবে সূচকটি 0 থেকে শুরু হয়? অদ্ভুত?
জ্যাক

1
@ জ্যাক: এটি খুব অদ্ভুত শোনায়। আপনি যদি একটি পৃথক প্রশ্ন হিসাবে আপনার কোড পোস্ট করেন তবে আমি নিশ্চিত যে কেউ আপনাকে সহায়তা করতে সক্ষম হবে।
অ্যাডামস্কি

23

আমাদের যে বিবেচনা করে আমরা Set<String> stringSetনিম্নলিখিত ব্যবহার করতে পারি:

জাভা 10 (অবিশ্বাস্য তালিকা)

List<String> strList = stringSet.stream().collect(Collectors.toUnmodifiableList());

জাভা 8 (সংশোধনযোগ্য তালিকা)

import static java.util.stream.Collectors.*;
List<String> stringList1 = stringSet.stream().collect(toList());

পদ্ধতির জন্য ডক হিসাবেtoList()

তালিকার ধরণ, পরিবর্তনীয়তা, সিরিয়ালযোগ্যতা বা থ্রেড-সুরক্ষার কোনও গ্যারান্টি নেই returned যদি প্রত্যাবর্তিত তালিকার উপর আরও নিয়ন্ত্রণের প্রয়োজন হয়, সারণি (সরবরাহকারী) ব্যবহার করুন।

সুতরাং যদি আমাদের একটি নির্দিষ্ট প্রয়োগের প্রয়োজন হয় যেমন ArrayListআমরা এটি এইভাবে পেতে পারি:

List<String> stringList2 = stringSet.stream().
                              collect(toCollection(ArrayList::new));

জাভা 8 (অবিশ্বাস্য তালিকা)

আমরা Collections::unmodifiableListপদ্ধতিটি ব্যবহার করতে পারি এবং আগের উদাহরণগুলিতে ফিরে আসা তালিকাটি গুটিয়ে রাখতে পারি। আমরা আমাদের নিজস্ব কাস্টম পদ্ধতিটিও এইভাবে লিখতে পারি:

class ImmutableCollector {
    public static <T> Collector<T, List<T>, List<T>> toImmutableList(Supplier<List<T>> supplier) {
            return Collector.of( supplier, List::add, (left, right) -> {
                        left.addAll(right);
                        return left;
                    }, Collections::unmodifiableList);
        }
}

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

List<String> stringList3 = stringSet.stream()
             .collect(ImmutableCollector.toImmutableList(ArrayList::new)); 

আরেকটি সম্ভাবনা হ'ল collectingAndThenপদ্ধতিটি ব্যবহার করা যা ফলাফল ফেরত দেওয়ার আগে কিছু চূড়ান্ত রূপান্তর করতে দেয়:

    List<String> stringList4 = stringSet.stream().collect(collectingAndThen(
      toCollection(ArrayList::new),Collections::unmodifiableList));

একটি বিষয় লক্ষণীয় হ'ল পদ্ধতিটি দস্তাবেজCollections::unmodifiableList অনুসারে নির্দিষ্ট তালিকার একটি অবিশ্বাস্য দৃশ্য প্রদর্শন করে । অপরিবর্তিতযোগ্য ভিউ সংগ্রহটি এমন একটি সংগ্রহ যা অনিবার্যযোগ্য এবং এটি একটি ব্যাকিং সংগ্রহের মধ্যেও একটি ভিউ। নোট করুন যে ব্যাকিং সংগ্রহে পরিবর্তনগুলি এখনও সম্ভব হতে পারে এবং যদি এটি ঘটে থাকে তবে তারা অবিস্মরণীয় দৃশ্যের মাধ্যমে দৃশ্যমান। তবে সংগ্রাহক পদ্ধতি জাভা 10-এ সত্যিকারের অপরিবর্তনীয় তালিকা ফিরিয়ে দেয় ।Collectors.unmodifiableList


আমি এই ব্যবহৃত একটি রূপান্তর করতে Set<Double>একটি থেকে List<Double, যেখানে সেট একটি থেকে এসেছেন LinkedHashMap'র .keySet()পদ্ধতি। অন্ধকার আমাকে বলেছিলেন একটি টাইপ মেলেনি ছিল, এবং আমি থেকে পরিবর্তিত করতে পারছিলেন না যে Objectকরতে List<Double>। আপনি আমাকে বলতে পারেন কেন এমনটি হতে পারে? আমি কাস্টিং দ্বারা এটি কাছাকাছি পেয়েছিলাম, কিন্তু আমি কেন এমন হয় তা ভাবছিলাম।
Ungeheuer

1
হ্যাঁ, যেহেতু জাভা ডেভেলপারদের আরও বেশি বেশি জাভা 8 বৈশিষ্ট্য ব্যবহার করা উচিত, তাই উপরোক্ত 2 টি উত্তরের চেয়ে এই উত্তরটি ভাল।
শুভম পান্ডে

13

সেট করার জন্য এটি চেষ্টা করুন :

Set<String> listOfTopicAuthors = .....
List<String> setList = new ArrayList<String>(listOfTopicAuthors); 

মানচিত্রের জন্য এটি ব্যবহার করে দেখুন :

Map<String, String> listOfTopicAuthors = .....
// List of values:
List<String> mapValueList = new ArrayList<String>(listOfTopicAuthors.values());
// List of keys:
List<String> mapKeyList = new ArrayList<String>(listOfTopicAuthors.KeySet());

2

আপনি যদি পেয়ারা ব্যবহার করছেন তবে আপনি স্ট্যাটিকালি তালিকাগুলিnewArrayList থেকে পদ্ধতিটি আমদানি করুন :

List<String> l = newArrayList(setOfAuthors);

0

আপনার কোডের প্রসঙ্গে আপনি ঠিক কী করছেন তা সত্যিই নিশ্চিত নয় তবে ...

কেন এ listOfTopicAuthorsভেরিয়েবল একেবারে তৈরি ?

List<String> list = Arrays.asList((....).toArray( new String[0] ) );

"...." উপস্থাপন করে তবে আপনার সেটটি খেলতে আসে, তা নতুন হোক বা অন্য কোনও স্থান থেকে এসেছে।

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