জাভাতে কোনও অ্যারে কীভাবে সেট এ রূপান্তর করবেন


717

আমি জাভাতে একটি অ্যারে একটি সেটে রূপান্তর করতে চাই। এটি করার কিছু সুস্পষ্ট উপায় রয়েছে (অর্থাত লুপের সাহায্যে) তবে আমি কিছুটা পরিষ্কার, কিছু চাই:

java.util.Arrays.asList(Object[] a);

কোন ধারনা?

উত্তর:


1226

এটার মত:

Set<T> mySet = new HashSet<>(Arrays.asList(someArray));

জাভা 9+ তে, যদি অবিচ্ছেদ্য সেট ঠিক থাকে:

Set<T> mySet = Set.of(someArray);

জাভা 10+ এ, জেনেরিক ধরণের পরামিতি অ্যারে উপাদান ধরণের থেকে অনুমান করা যায়:

var mySet = Set.of(someArray);

10
আমি শেষ <T> ছেড়ে দেব, অন্যথায় সুন্দর অনিলিঞ্জার!
শাসক

165
@ ডাটাজ: ভুল; Arrays.asListও (1)।
স্ল্যাक्स

67
মনে রাখবেন যে আপনি যদি এই পদ্ধতিটি ইন্টি [যেমন] আরিটের মতো একটি অ্যারে ব্যবহার করেন তবে এটি একটি তালিকা << int []> ফিরিয়ে দেবে যাতে আপনার উদ্দেশ্যযুক্ত আচরণ পেতে রেপার ক্লাসগুলি ব্যবহার করা উচিত।
টি। মার্কেল

6
@ অজয়গৌতম: এটি কেবল পেয়ারাতেই।
এসএলএক্স

10
: আমি পাঠযোগ্যতা দক্ষতা বেশি (প্রায়) প্রত্যেক সময় নেব blog.codinghorror.com/...
ডেভিড Carboni

221
Set<T> mySet = new HashSet<T>();
Collections.addAll(mySet, myArray);

এটি জেডিকে 6 থেকে সংগ্রহসমূহ adএডএলএল (জাভা.ইটিল.ক্লেকশন, টি ...)

অতিরিক্তভাবে: আমাদের অ্যারে আদিমতায় পূর্ণ হলে কী হবে?

জেডিকে <8 এর জন্য, আমি কেবল forএকটি পাসে মোড়ানো এবং অ্যাড-টু-সেট করতে সুস্পষ্ট লুপটি লিখব ।

জেডিকে> = 8 এর জন্য একটি আকর্ষণীয় বিকল্পটি হ'ল:

Arrays.stream(intArray).boxed().collect(Collectors.toSet());

5
আপনি এটি দিয়ে করতে পারেন java.util.Collections.addAll। এছাড়াও, আমি আর কমন্স সংগ্রহের সুপারিশ করব না, এর সাথে কী উত্সাহ দেওয়া হচ্ছে না এবং পেয়ারা বিদ্যমান নেই।
কলিনড

14
ওয়ান-লাইনার না হলেও স্ল্যাকসের উত্তরের চেয়ে বেশি দক্ষ হওয়ার জন্য +1।
অ্যাড্রিয়ান

1
@ অ্যাড্রিয়ান আমি এটি প্রশ্ন করি। আমি মনে করি addAllও ( এন ) হবে।
স্টিভ পাওয়েল

1
আমি বিশ্বাস করি যে কীভাবে স্ল্যাक्सের সমাধান একটি তালিকা উদাহরণ তৈরি করে যা শেষ পর্যন্ত ফেলে দেওয়া হয় was এই পার্থক্যের প্রকৃত প্রভাব সম্ভবত অত্যন্ত ন্যূনতম, তবে আপনি যে প্রেক্ষাপটে এটি করছেন তার উপর নির্ভর করতে পারে - টাইট লুপস বা খুব বড় সেটগুলি এই দুটি বিকল্পের মধ্যে খুব আলাদা আচরণ করতে পারে।
JavadocMD

13
কালেকশন.অ্যাডএলএল () জাভাদোক (জাভা)): "এই সুবিধামত পদ্ধতির আচরণটি সি.এডএল (অ্যারেএস.এললিস্ট (উপাদান)) এর সাথে সমান, তবে বেশিরভাগ প্রয়োগের অধীনে এই পদ্ধতিটি উল্লেখযোগ্যভাবে দ্রুত চালিত হতে পারে। "
বার্ট এফ

124

সঙ্গে পেয়ারা আপনি কি করতে পারেন:

T[] array = ...
Set<T> set = Sets.newHashSet(array);

27
ইমিটবেটসেট.কপিওফ (অ্যারে)। (আমি এটিও উল্লেখ করতে চাই, আমি অনুমান করি))
কেভিন বোউরিলিয়ন

উপাদানগুলির একটি নির্দিষ্ট তালিকার জন্য আপনি ব্যবহার করতে পারেন: ইমিউটেবলসেট.ওফ (ই 1, ই 2, ..., এন)। লক্ষ্য করুন আপনি এটি তৈরির পরে এই সেটটি পরিবর্তন করতে পারবেন না।
পিসারুক

1
সতর্কতা অবলম্বন করুন, পেয়ারা জাভাদোক বলেছেন: "এই পদ্ধতিটি আসলে খুব কার্যকর নয় এবং সম্ভবত ভবিষ্যতে অবহেলা করা হবে।" তারা মান দিকে নির্দেশ new HashSet<T>(Arrays.asList(someArray))Google.github.io/guava/reLives/19.0/api/docs/com/google/common/…
আলেকজান্ডার ক্লিমেটসেক

67

জাভা 8:

String[] strArray = {"eins", "zwei", "drei", "vier"};

Set<String> strSet = Arrays.stream(strArray).collect(Collectors.toSet());
System.out.println(strSet);
// [eins, vier, zwei, drei]

2
সমান্তরালভাবে এটি করা কি মূল্যবান?
রাফি খ্যাচাডৌড়িয়ান

@ রাফিখাটচাডোরিয়ান এটি সমান্তরালভাবে করা উচিত নয়। অ্যারে.স্ট্রিম স্ট্রিমটিতে কোনও প্রতিশ্রুতি দেয় না। এর জন্য আপনাকে ফলস্বরূপ সমান্তরাল () কল করতে হবে।
ফেলিক্স এস

আপনি সমান্তরাল স্ট্রিম ()ও কল করতে পারেন। @ রফিখাটচডৌরিয়ানের প্রশ্নের উত্তর দেওয়ার জন্য, সম্ভবত না। আপনি কোনও কার্য সম্পাদনের সমস্যা লক্ষ্য করছেন কিনা তা পরিমাপের চেষ্টা করুন।
দেব

6
সাধারণত, সমান্তরাল এড়ানো। ডিফল্টরূপে এটি আপনার অ্যাপ্লিকেশন জুড়ে একটি একক থ্রেডপুল ব্যবহার করে এবং থ্রেড শুরু করতে এবং যোগদানের জন্য ওভারহেড ক্রমশ কয়েকশ আইটেমের মাধ্যমে প্রবাহিত হওয়ার চেয়ে খারাপ is শুধুমাত্র খুব অল্প পরিস্থিতিতেই সমান্তরাল আসলে সুবিধা নিয়ে আসে।
tkruse


30

জাভা 8

আমাদের Streamপাশাপাশি ব্যবহারের বিকল্প রয়েছে । আমরা বিভিন্ন উপায়ে স্ট্রিম পেতে পারি:

Set<String> set = Stream.of("A", "B", "C", "D").collect(Collectors.toCollection(HashSet::new));
System.out.println(set);

String[] stringArray = {"A", "B", "C", "D"};
Set<String> strSet1 = Arrays.stream(stringArray).collect(Collectors.toSet());
System.out.println(strSet1);

// if you need HashSet then use below option.
Set<String> strSet2 = Arrays.stream(stringArray).collect(Collectors.toCollection(HashSet::new));
System.out.println(strSet2);

সোর্স কোড Collectors.toSet()দেখায় যে উপাদান একটি থেকে একের পর এক যোগ করা হয় HashSetকিন্তু স্পেসিফিকেশন নিশ্চয়তা দেয় না এটি একটি হতে হবে HashSet

"সেটটি ফেরানোর ধরণ, পরিবর্তনীয়তা, ধারাবাহিকতা বা থ্রেড-সুরক্ষার কোনও গ্যারান্টি নেই" "

সুতরাং পরবর্তী বিকল্পটি ব্যবহার করা ভাল। আউটপুটটি হ'ল: [A, B, C, D] [A, B, C, D] [A, B, C, D]

অপরিবর্তনীয় সেট (জাভা 9)

জাভা 9 প্রবর্তিত Set.ofস্ট্যাটিক ফ্যাক্টরি পদ্ধতি প্রবর্তিত উপাদান বা অ্যারের জন্য অপরিবর্তনীয় সেট প্রদান করে।

@SafeVarargs
static <E> Set<E> of​(E... elements)

পরীক্ষা করে দেখুন অপরিবর্তনীয় সেট স্ট্যাটিক কারখানার পদ্ধতি বিস্তারিত জানার জন্য।

অপরিবর্তনীয় সেট (জাভা 10)

আমরা দুটি উপায়ে একটি অপরিবর্তনীয় সেটও পেতে পারি:

  1. Set.copyOf(Arrays.asList(array))
  2. Arrays.stream(array).collect(Collectors.toUnmodifiableList());

Collectors.toUnmodifiableList()অভ্যন্তরীণভাবে Set.ofজাভা 9-তে প্রবর্তিত পদ্ধতিটি পদ্ধতিটি আরও জানায় আমার এই উত্তরটিও পরীক্ষা করে দেখুন।


1
+1 এর জন্য Stream.of()- আমি সেটিকে জানতাম না। একটি ছোট বোতল সম্পর্কে Collectors.toSet(): আপনি বলছেন যে অনুমান একের পর এক উপাদান যুক্ত করার গ্যারান্টি দেয় না, তবে এর অর্থ এটি: "জমে ... একটি নতুন হিসাবে Set"। এবং এটি আরও পঠনযোগ্য - আমার মনের পক্ষে এতটাই পছন্দনীয়, আপনার যদি কংক্রিটের ধরণ, পরিবর্তনীয়তা, সিরিয়ালাইজিবিলিটি এবং থ্রেড-সুরক্ষার গ্যারান্টির প্রয়োজন না হয়।
অ্যান্ড্রু স্পেন্সার

@ অ্যান্ড্রুস্পেনসর স্পেক গ্যারান্টি দেয় না যে সেটটি বাস্তবায়ন হবে HashSet। এটি কেবল গ্যারান্টি দেয় যে এটি হবে Setএবং এটাই আমার অর্থ। আশা করি আমি এটি পরিষ্কার করে দিয়েছি।
akhil_mittal

দুঃখিত, এবং ধন্যবাদ, আমি এটি অর্থ হিসাবে অনুমান করি "স্পেক একের সাথে এক যোগ করার গ্যারান্টি দেয় না" বরং "স্পেকটি হ্যাশসেটের গ্যারান্টি দেয় না"। পরিষ্কার করার জন্য একটি সম্পাদনার প্রস্তাব দেওয়া হয়েছে।
অ্যান্ড্রু স্পেন্সার

19

আপনি করার পরে আপনি Arrays.asList(array)কার্যকর করতে পারেনSet set = new HashSet(list);

এখানে একটি নমুনা পদ্ধতি রয়েছে, আপনি লিখতে পারেন:

public <T> Set<T> GetSetFromArray(T[] array) {
    return new HashSet<T>(Arrays.asList(array));
}

আমি এমন একটি পদ্ধতির জন্য প্রত্যাশা করছিলাম যা সরাসরি অ্যারে থেকে একটি সেট ফেরত দেয়, একটির কি অস্তিত্ব আছে?

1
আপনি যদি নিজের আগ্রহী হন তবে আপনি নিজের লেখা লিখতে পারেন :)
পেটর মিনচেভ

12

ইন অন্ধকার সংগ্রহগুলি নিম্নলিখিত কাজ করবে:

Set<Integer> set1 = Sets.mutable.of(1, 2, 3, 4, 5);
Set<Integer> set2 = Sets.mutable.of(new Integer[]{1, 2, 3, 4, 5});
MutableSet<Integer> mutableSet = Sets.mutable.of(1, 2, 3, 4, 5);
ImmutableSet<Integer> immutableSet = Sets.immutable.of(1, 2, 3, 4, 5);

Set<Integer> unmodifiableSet = Sets.mutable.of(1, 2, 3, 4, 5).asUnmodifiable();
Set<Integer> synchronizedSet = Sets.mutable.of(1, 2, 3, 4, 5).asSynchronized();
ImmutableSet<Integer> immutableSet = Sets.mutable.of(1, 2, 3, 4, 5).toImmutable();

দ্রষ্টব্য: আমি গ্রহগ্রাহ সংগ্রহের প্রতিশ্রুতিবদ্ধ


7

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

// Fixed-size list
List list = Arrays.asList(array);

// Growable list
list = new LinkedList(Arrays.asList(array));

// Duplicate elements are discarded
Set set = new HashSet(Arrays.asList(array));

এবং বিপরীত

// Create an array containing the elements in a list
Object[] objectArray = list.toArray();
MyClass[] array = (MyClass[])list.toArray(new MyClass[list.size()]);

// Create an array containing the elements in a set
objectArray = set.toArray();
array = (MyClass[])set.toArray(new MyClass[set.size()]);

6

আমি উপরের পরামর্শ থেকে নীচে লিখেছি - এটি চুরি করুন ... দুর্দান্ত!

/**
 * Handy conversion to set
 */
public class SetUtil {
    /**
     * Convert some items to a set
     * @param items items
     * @param <T> works on any type
     * @return a hash set of the input items
     */
    public static <T> Set<T> asSet(T ... items) {
        return Stream.of(items).collect(Collectors.toSet());
    }
}

উপরের জন্য অ্যারে.স্ট্রিম স্ট্রিম.ফের চেয়ে ভাল হতে পারে।
অ্যাশলে ফ্রিজ 10

5

সেখানে মহান উত্তর অনেক ইতিমধ্যে হয়েছে, কিন্তু তাদের অধিকাংশই প্রিমিটিভের অ্যারে সাথে কাজ করবে না (যেমন int[], long[], char[], byte[], ইত্যাদি)

জাভা 8 এবং তারপরে, আপনি অ্যারেটি দিয়ে বাক্স করতে পারেন:

Integer[] boxedArr = Arrays.stream(arr).boxed().toArray(Integer[]::new);

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

Stream.of(boxedArr).collect(Collectors.toSet());

0

কিছু সময় কিছু স্ট্যান্ডার্ড লাইব্রেরি ব্যবহার করে অনেক সহায়তা করে। অ্যাপাচি কমন্স সংগ্রহগুলি দেখার চেষ্টা করুন । এক্ষেত্রে আপনার সমস্যাগুলি এই জাতীয় কিছুতে রূপান্তরিত হয়

String[] keys = {"blah", "blahblah"}
Set<String> myEmptySet = new HashSet<String>();
CollectionUtils.addAll(pythonKeywordSet, keys);

এবং এখানে সংগ্রহশালা জাভাদোক


4
ব্যবহারকারী অ্যাপাচি কমন্স ব্যবহার করতে পারে না
অ্যাড্রিয়ান

যদি ব্যবহারকারী অ্যাপাচি কমন্স ব্যবহার না করে তবে এটি তার প্রথম ভুল।
জেরিল কুক

3
আপনি এর পরিবর্তে কেন এটি ব্যবহার করবেন java.util.Collections.addAll(myEmptySet, keys);??
djeikyb


0

ইন জাভা 10 :

String[] strs = {"A", "B"};
Set<String> set = Set.copyOf(Arrays.asList(strs));

Set.copyOfএকটি unmodifiable ফেরৎ Setদেওয়া উপাদান ধারণকারী Collection

 প্রদত্ত Collectionঅবশ্যই nullহওয়া উচিত নয় এবং এতে কোনও nullউপাদান থাকতে হবে না ।


0
private Map<Integer, Set<Integer>> nobreaks = new HashMap();
nobreaks.put(1, new HashSet(Arrays.asList(new int[]{2, 4, 5})));
System.out.println("expected size is 3: " +nobreaks.get(1).size());

আউটপুট হয়

expected size is 3: 1

এটি পরিবর্তন করুন

nobreaks.put(1, new HashSet(Arrays.asList( 2, 4, 5 )));

আউটপুট হয়

expected size is 3: 3

-1

Android এর জন্য যে কেউ সমাধান করছেন:

কোটলিন সংগ্রহের সমাধান

তারকাচিহ্ন *হয় spreadঅপারেটর। এটি সংগ্রহের সমস্ত উপাদান পৃথকভাবে প্রয়োগ করে, প্রতিটি varargপদ্ধতি প্যারামিটারে পাস করে । এটি সমান:

val myArray = arrayOf("data", "foo")
val mySet = setOf(*myArray)

// Equivalent to
val mySet = setOf("data", "foo")

// Multiple spreads ["data", "foo", "bar", "data", "foo"]
val mySet = setOf(*myArray, "bar", *myArray)

কোনও পরামিতি পাস করা setOf()খালি সেটে ফল দেয় না।

এছাড়াও setOf, আপনি একটি নির্দিষ্ট হ্যাশ প্রকারের জন্য এগুলির যে কোনওটি ব্যবহার করতে পারেন:

hashSetOf()
linkedSetOf()
mutableSetOf()
sortableSetOf()

সংগ্রহ আইটেমের ধরণটি স্পষ্টভাবে কীভাবে সংজ্ঞায়িত করা যায়।

setOf<String>()
hashSetOf<MyClass>()

-2

new HashSet<Object>(Arrays.asList(Object[] a));

তবে আমি মনে করি এটি আরও কার্যকর হবে:

final Set s = new HashSet<Object>();    
for (Object o : a) { s.add(o); }         

এটি সত্যিই আরও দক্ষ হবে না (কমপক্ষে ভেবে দেখার মতো নয়)।
কলিনড

3
কনস্ট্রাক্টর সংস্করণ সহ, প্রাথমিক প্রাথমিক ক্ষমতা HashSetঅ্যারের আকারের উপর নির্ভর করে সেট করা হয়, উদাহরণস্বরূপ।
কলিনড

3
এই উত্তরটি মনে হয় এমন মূক হয় না: 'সংগ্রহ.এডএলএল (মাইসেট, মাইআর্রে);' java.util. সংগ্রহ থেকে একই পুনরাবৃত্তকারী ব্যবহার করা হয় তবে প্লাস ওয়ান বুলিয়ান অপারেশন। প্লাস্ট হিসাবে বার্ট এফ কালেকশন.এডডএল ইঙ্গিত করেছেন সি.এডিএল (অ্যারেজ.এললিস্ট (উপাদানসমূহ)) এর তুলনায় "বেশিরভাগ বাস্তবায়নের মধ্যে উল্লেখযোগ্যভাবে দ্রুত চালিত হতে পারে"
জোরব

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