जावा में एक सूची को एक सेट में बदलने का सबसे आसान तरीका


627

जावा में a Listको कन्वर्ट करने का सबसे आसान तरीका क्या है Set?

जवाबों:


1065
Set<Foo> foo = new HashSet<Foo>(myList);

3
हालांकि इस उत्तर को सही करने के लिए सबसे अच्छा / स्वीकृत उत्तर होने के लिए पर्याप्त तकनीकी संदर्भ का अभाव है, क्योंकि यहां ऐसे नुकसान होते हैं जिनके आधार पर कार्यान्वयन Setऔर Mapएक का उपयोग किया जाता है; HashSetहै ग्रहण यहाँ।
मैडब्रेक्स

145

मैं sepp2k से सहमत हूं, लेकिन कुछ अन्य विवरण हैं जो मायने रख सकते हैं:

new HashSet<Foo>(myList);

आपको एक बिना सेट वाला सेट देगा जिसमें डुप्लिकेट नहीं है। इस स्थिति में, आपके ऑब्जेक्ट्स पर असमान () पद्धति का उपयोग करके डुप्लिकेट की पहचान की जाती है। यह .hashCode () विधि के संयोजन में किया जाता है। (समानता पर अधिक जानकारी के लिए यहां देखें )

एक विकल्प जो क्रमबद्ध सेट देता है:

new TreeSet<Foo>(myList);

यह काम करता है अगर फू तुलनात्मक लागू करता है। यदि यह नहीं है तो आप एक तुलनित्र का उपयोग करना चाह सकते हैं:

Set<Foo> lSet = new TreeSet<Foo>(someComparator);
lSet.addAll(myList);

यह तुलनीयता सुनिश्चित करने के लिए या तो तुलना () (तुलनीय अंतरफलक से) या तुलना () (तुलनाकर्ता से) पर निर्भर करता है। इसलिए, यदि आप सिर्फ विशिष्टता की परवाह करते हैं, तो हैशसेट का उपयोग करें। यदि आप छँटाई के बाद हैं, तो ट्रीसेट पर विचार करें। (याद रखें: बाद में ऑप्टिमाइज़ करें!) अगर स्पेस दक्षता मायने रखती है तो समय दक्षता के मामले में हैशसेट का उपयोग करें, ट्रीसेट को देखें। ध्यान दें कि सेट और मानचित्र के अधिक कुशल कार्यान्वयन ट्रोव (और अन्य स्थानों) के माध्यम से उपलब्ध हैं।


कस्टम तुलनित्र उपयोग मामले को शामिल करने के लिए धन्यवाद!
जस्टिन पपीज

70

यदि आप अमरूद पुस्तकालय का उपयोग करते हैं :

Set<Foo> set = Sets.newHashSet(list);

या और अच्छा:

Set<Foo> set = ImmutableSet.copyOf(list);

2
ImmutableSet.copyOf क्यों बेहतर है?
user672009

1
बेसिक जावा नए हैशसेट () पर अमरूद के न्यूहेटसेट () के क्या फायदे हैं?
नेल्दा.टेकस्पैरेसी

@ Nelda.techspiress javadoc चर्चा करता है कि विधि का उपयोग किया जाना चाहिए या नहीं। अंतिम भाग पर ध्यान दें: यह विधि बहुत उपयोगी नहीं है और संभवतः भविष्य में इसका पदावनत किया जाएगा। हालांकि मैं थोड़ा हैरान हूं कि ImmutableSet.of()उदाहरण के रूप में, एक कारक के रूप में उल्लेख नहीं किया गया है । संपादित करें: यह कारक नहीं हो सकता है क्योंकि सभी ओवरलोड्स अनावश्यक हैं।
shmosel

1
अरे संदर्भ @shmosel के लिए धन्यवाद, लेकिन मैं अनुभवजन्य ज्ञान के लिए और अधिक लग रही थी। जिन लोगों ने अमरूद का उपयोग किया है, उनके लिए अमरूद को हाशसेट में क्यों चुना जाएगा?
Nelda.techspiress

27

जावा 8 का उपयोग करके आप स्ट्रीम का उपयोग कर सकते हैं:

List<Integer> mylist = Arrays.asList(100, 101, 102);
Set<Integer> myset = mylist.stream().collect(Collectors.toSet()));

10
क्या आपने इस पर प्रदर्शन दंड की जाँच की है? यह एक iterable + पुनरावृत्त, एक नया HashSet (), और फिर प्रत्येक सूची आइटम के लिए, नए सेट पर एक addAll () कॉल करेगा। कुल मिलाकर, सी.के. 5 वस्तुओं को एक नए हैशसेट (सूची) के रूप में सरल बनाने के लिए।
अगस्टोन होर्वाथ

1
@AgostonHorvath आपकी टिप्पणी के लिए धन्यवाद। मैं मूल रूप से उस जानकारी की तलाश में था जब मैं यहाँ आया था।
TheRealChx101

17
Set<E> alphaSet  = new HashSet<E>(<your List>);

या पूरा उदाहरण

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class ListToSet
{
    public static void main(String[] args)
    {
        List<String> alphaList = new ArrayList<String>();
        alphaList.add("A");
        alphaList.add("B");
        alphaList.add("C");
        alphaList.add("A");
        alphaList.add("B");
        System.out.println("List values .....");
        for (String alpha : alphaList)
        {
            System.out.println(alpha);
        }
        Set<String> alphaSet = new HashSet<String>(alphaList);
        System.out.println("\nSet values .....");
        for (String alpha : alphaSet)
        {
            System.out.println(alpha);
        }
    }
}

1
एक पूर्ण कोड उदाहरण के लिए +1। यहाँ एक अतिरिक्त बात यह है कि हैशिंग को चलाने से लेकर चलाने तक की गारंटी नहीं है। इसका मतलब है कि 'सेट मान .....' के बाद छपी सूची 'एबीसी' एक रन और 'सीबीए' एक और रन हो सकती है। जैसा कि मैंने अपने उत्तर में उल्लेख किया है, आप स्थिर ऑर्डर प्राप्त करने के लिए एक पेड़ सेट का उपयोग कर सकते हैं। एक अन्य विकल्प एक लिंक्डहैशसेट का उपयोग करना होगा जो उस आदेश को याद करता है जो इसमें आइटम जोड़े गए थे।
स्पाइना

8

मैं सेट करने के लिए परिवर्तित करने से पहले एक अशक्त जाँच करूँगा।

if(myList != null){
Set<Foo> foo = new HashSet<Foo>(myList);
}

3
याSet<Foo> foo = myList == null ? Collections.emptySet() : new HashSet<Foo>(myList);
vegemite4me

6

आप परिवर्तित कर सकते हैं List<>करने के लिएSet<>

Set<T> set=new HashSet<T>();

//Added dependency -> If list is null then it will throw NullPointerExcetion.

Set<T> set;
if(list != null){
    set = new HashSet<T>(list);
}

मुझे लगता है कि आप इसका मतलब लिस्ट से सेट में डालना चाहते हैं।
साइमन


6

जावा - addAll

set.addAll(aList);

जावा - नई वस्तु

new HashSet(list)

जावा-8

list.stream().collect(Collectors.toSet());

गुवा का उपयोग करना

 Sets.newHashSet(list)

अपाचे कॉमन्स

CollectionUtils.addAll(targetSet, sourceList);

जावा 10

var set = Set.copyOf(list);

5

आइए हम अपने अपेक्षाकृत नए दोस्त को न भूलें एपीआई। यदि आपको इसे सेट करने से पहले सूची को प्रीप्रोसेस करने की आवश्यकता है, तो ऐसा होना बेहतर है:

list.stream().<here goes some preprocessing>.collect(Collectors.toSet());

4

कंस्ट्रक्टर का उपयोग करने का सबसे अच्छा तरीका

Set s= new HashSet(list);

जावा 8 में आप स्ट्रीम एपी ::

Set s= list.stream().collect(Collectors.toSet());

3

एक पाने के लिए विभिन्न तरीके हैं Set:

    List<Integer> sourceList = new ArrayList();
    sourceList.add(1);
    sourceList.add(2);
    sourceList.add(3);
    sourceList.add(4);

    // Using Core Java
    Set<Integer> set1 = new HashSet<>(sourceList);  //needs null-check if sourceList can be null.

    // Java 8
    Set<Integer> set2 = sourceList.stream().collect(Collectors.toSet());
    Set<Integer> set3 = sourceList.stream().collect(Collectors.toCollection(HashSet::new));

    //Guava
    Set<Integer> set4 = Sets.newHashSet(sourceList);

    // Apache commons
    Set<Integer> set5 = new HashSet<>(4);
    CollectionUtils.addAll(set5, sourceList);

जब हम का उपयोग Collectors.toSet()यह एक सेट देता है और डॉक के अनुसार: There are no guarantees on the type, mutability, serializability, or thread-safety of the Set returned। अगर हम प्राप्त करना चाहते हैं HashSetतो हम एक सेट (चेक set3) प्राप्त करने के लिए अन्य विकल्प का उपयोग कर सकते हैं ।


3

जावा 10 के साथ, अब आप Set#copyOfआसानी List<E>से एक अयोग्य को परिवर्तित करने के लिए उपयोग कर सकते हैं Set<E>:

उदाहरण:

var set = Set.copyOf(list);

ध्यान रखें कि यह एक अनियंत्रित ऑपरेशन है, और nullतत्वों की अनुमति नहीं है , क्योंकि यह एक फेंक देगा NullPointerException

यदि आप इसे संशोधित करने की इच्छा रखते हैं, तो बस इसे कंस्ट्रक्टर के Setकार्यान्वयन में पास करें।



2

यदि आप ग्रहण संग्रह का उपयोग करते हैं :

MutableSet<Integer> mSet = Lists.mutable.with(1, 2, 3).toSet();
MutableIntSet mIntSet = IntLists.mutable.with(1, 2, 3).toSet();

MutableSetइंटरफ़ेस फैली java.util.Setजबकि MutableIntSetइंटरफेस नहीं करता है। आप कारखाने वर्ग का उपयोग करके किसी Iterableको भी परिवर्तित कर सकते हैं ।SetSets

Set<Integer> set = Sets.mutable.withAll(List.of(1, 2, 3));

यहाँ ग्रहण संग्रहों में उपलब्ध उत्परिवर्तित कारखानों की अधिक व्याख्या है

यदि आप एक ImmutableSetसे चाहते हैं List, तो आप Setsकारखाने का उपयोग इस प्रकार कर सकते हैं :

ImmutableSet<Integer> immutableSet = Sets.immutable.withAll(List.of(1, 2, 3))

नोट: मैं एक्लिप्स कलेक्शंस के लिए कमिट हूं


0

याद रखें कि, सूची से सेट में परिवर्तित करना डुप्लिकेट को संग्रह से हटा देगा क्योंकि सूची डुप्लिकेट का समर्थन करती है लेकिन सेट जावा में डुप्लिकेट का समर्थन नहीं करता है।

प्रत्यक्ष रूपांतरण: किसी सूची को सेट में परिवर्तित करने का सबसे सामान्य और सरल तरीका

// Creating a list of strings
List<String> list = Arrays.asList("One", "Two", "Three", "Four");

// Converting a list to set
Set<String> set = new HashSet<>(list);

Apache Commons Collections: सूची को सेट में बदलने के लिए आप कॉमन्स कलेक्शंस एपीआई का उपयोग भी कर सकते हैं: -

// Creating a list of strings
List<String> list = Arrays.asList("One", "Two", "Three", "Four");

// Creating a set with the same number of members in the list 
Set<String> set = new HashSet<>(4);

// Adds all of the elements in the list to the target set
CollectionUtils.addAll(set, list);

स्ट्रीम का उपयोग करना: किसी अन्य तरीके से दी गई सूची को स्ट्रीम में बदलना है, फिर स्ट्रीम पर सेट करना है: -

// Creating a list of strings 
List<String> list = Arrays.asList("One", "Two", "Three", "Four"); 

// Converting to set using stream 
Set<String> set = list.stream().collect(Collectors.toSet()); 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.