क्या .asSet (…) किसी भी एपीआई में मौजूद है?


108

मैं एक सेट बनाने के लिए एक बहुत ही सरल तरीके की तलाश कर रहा हूं।

Arrays.asList("a", "b" ...) एक बनाता है List<String>

क्या इसके लिए भी कुछ ऐसा ही है Set?



1
यह नहीं है, एक सेट बनाना और एक सेट में एक ऐरे को परिवर्तित करना एक ही बात नहीं है
cahen

जवाबों:


84

अब जावा 8 के साथ आप तीसरे पक्ष के ढांचे की आवश्यकता के बिना ऐसा कर सकते हैं:

Set<String> set = Stream.of("a","b","c").collect(Collectors.toSet());

देख संग्राहक

का आनंद लें!


4
आजकल जावा 8 के साथ यह शायद सबसे अच्छा जवाब है क्योंकि यह 3 पार्टी पुस्तकालयों पर निर्भर नहीं करता है और इसे आसानी से अन्य संग्रह प्रकारों के लिए अनुकूलित किया जा सकता है, इसलिए मैं इसे स्वीकृत के रूप में सेट कर रहा हूं। अन्य महान समाधानों के लिए सभी को बहुत धन्यवाद। (btw, यह सेट
परस्पर है

3
अब, जिसने भी कहा कि जावा बहुत क्रियात्मक था? बेशक यह सबसे अच्छा जवाब है!
BobDoolittle

बहुत बहुत धन्यवाद @ थोडा डिटेल!
श्री एंडरसन

2
जावा 9+ का उपयोग करने वाले किसी व्यक्ति के लिए कृपया नीचे दिए गए होली के उत्तर को भी देखें: stackoverflow.com/a/48025159/229743
टेलर

1
निर्दोष जवाब श्री एंडरसन!
गौरव

63

अमरूद का उपयोग करना , यह उतना ही सरल है:

Set<String> mySet = ImmutableSet.<String> of("a", "b");

या एक परस्पर सेट के लिए:

Set<String> mySet = Sets.newHashSet("a", "b")

अधिक डेटा प्रकारों के लिए अमरूद उपयोगकर्ता गाइड देखें


क्या इसका कोई गैर-अपरिहार्य संस्करण है?
काहेन

3
@cahen हाँ: Sets.newHashSet("a", "b")याSets.newLinkedHashSet("a", "b")
सीन पैट्रिक फ्लोयड

1
मैंने उत्तर के लिए एक परिवर्तनशील संस्करण जोड़ा।
माइकल शमीयर

वास्तव में, Sets.newLinkedHashSet()उस हस्ताक्षर के साथ मौजूद नहीं है, क्षमा करें
सीन पैट्रिक फ्लोयड

मैं एक प्रकार के तर्कों को हटाने में सक्षम था:Set<String> mySet = ImmutableSet.of("a", "b");
21


24

शून्य या एक सदस्यों वाले सेट के विशेष मामलों के लिए, आप इसका उपयोग कर सकते हैं:

java.util.Collections.EMPTY_SET

तथा:

java.util.Collections.singleton("A")

इन विशेष मामलों के लिए, यह सबसे अच्छा समाधान होने की संभावना है क्योंकि यह मानक java.util API का उपयोग करता है
arcuri82

2
java.util.Collections.emptySet()मेरे मन में, प्रकार सुरक्षा के कारण EMPTY_SET से अधिक पसंद किया जाता है। कलेक्शंस क्लास में टिप्पणियों से:Unlike the like-named field, this method is parameterized.
Eddified

17

जैसा कि दूसरों ने कहा है, उपयोग करें:

new HashSet<String>(Arrays.asList("a","b"));

जावा में यह मौजूद नहीं होने का कारण यह है कि Arrays.asListएक निश्चित आकार की सूची, दूसरे शब्दों में:

public static void main(String a[])
{
  List<String> myList = Arrays.asList("a", "b");
  myList.add("c");
}

यह दिखाता है:

Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.AbstractList.add(Unknown Source)
    at java.util.AbstractList.add(Unknown Source)

वर्ग के Setअंदर एक "निश्चित आकार" का जेडीके कार्यान्वयन नहीं है Arrays। आप ऐसा क्यों चाहते हैं? एक Setगारंटी है कि कोई डुप्लिकेट नहीं है, लेकिन यदि आप उन्हें हाथ से टाइप कर रहे हैं, तो आपको उस कार्यक्षमता की आवश्यकता नहीं होनी चाहिए ... और Listअधिक विधियाँ हैं। दोनों इंटरफेस Collectionऔर विस्तार करते हैं Iterable


जैसा कि दूसरों ने कहा है, अमरूद का उपयोग करें यदि आप वास्तव में यह कार्यक्षमता चाहते हैं - क्योंकि यह जेडीके में नहीं है। उस पर जानकारी के लिए उनके जवाब (विशेष रूप से माइकल शमीयर के उत्तर) देखें।


3
यह अब तक का सबसे अच्छा जवाब है, क्योंकि यह बताता है कि Arrays.asList () वास्तव में क्या करता है। कई देवों का मानना ​​है कि Arrays.asList () एक java.util.ArrayList बनाता है, जबकि यह वास्तव में एक java.util बनाता है। ArrayL $ ArrayList (जो केवल आंशिक रूप से परिवर्तनशील है और अंतर्निहित सरणी का एक लाइव दृश्य है)
शॉन पैट्रिक फ़्लॉइड

1
जैसा कि कोई ऐसा क्यों करना चाहेगा, हाथ से सेट (या सूची) बनाने का सबसे आम कारण एक परीक्षण वर्ग में है जहां आप परीक्षण मूल्यों में उत्तीर्ण हो रहे हैं।
स्कॉट मैकइंटायर

14

जावा 9 में, फैक्ट्री विधियों के माध्यम से समान फ़ंक्शन जोड़ा गया है:

Set<String> oneLinerSet = Set.of("a", "b", ...);

( Listसाथ ही इसके लिए समतुल्य हैं ।)


मैंने यह कोशिश की और एक संकलक को चेतावनी मिली कि यह एपीआई विधि नहीं है।
फिलिप गियोसेफ़ी

यहाँ प्रासंगिक जावा डॉक: docs.oracle.com/javase/9/docs/api/java/util/Set.html है । जावा 9+ JDK का उपयोग करने के साथ-साथ, आपको जावा 9 अनुपालन का उपयोग करने के लिए अपने आईडीई या उपकरण को समायोजित करने की आवश्यकता हो सकती है (उदाहरण के लिए, मावेन के लिए, यह उन लोगों के लिए समान कदम होगा, लेकिन 1.9 पर सेट करें: stackoverflow.com/ प्रश्न / 16798066 /… )
होली कमिंस

काश हम जावा 9 का उपयोग कर सकें .. हम अतीत में रह रहे हैं! :(
jDub9

यह अच्छा है लेकिन तर्कों के आकार पर कुछ प्रतिबंध हैं ...
रैडोस्लाव इवानोव



2

यहाँ एक छोटी विधि है जिसका आप उपयोग कर सकते हैं

  /**
   * Utility method analogous to {@link java.util.Arrays#asList(Object[])}
   *
   * @param ts
   * @param <T>
   * @return the set of all the parameters given.
   */
  @SafeVarargs
  @SuppressWarnings("varargs")
  public static <T> Set<T> asSet(T... ts) {
    return new HashSet<>(Arrays.asList(ts));
  }

1

जावा 8 और एनम का उपयोग करने का एक और तरीका यह होगा:

Set<String> set = EnumSet.of(StandardOpenOption.CREATE, StandardOpenOption.READ);

EnumSet देखें ।

मैं इस दृष्टिकोण और के बीच एक प्रदर्शन विश्लेषण की सिफारिश करूंगा

Set<String> set = Stream.of(StandardOpenOption.CREATE, StandardOpenOption.READ).collect(Collectors.toSet());

क्योंकि यदि आपके पास पांच से अधिक तत्व हैं, तो विधि का javadoc बताता है कि प्रदर्शन समस्याएं हो सकती हैं जैसा कि आप Set.Of (E, E ...) के javadoc में देख सकते हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.