मैं एक सरणी को जावा में सेट में बदलना चाहूंगा। ऐसा करने के कुछ स्पष्ट तरीके हैं (जैसे कि एक लूप के साथ), लेकिन मैं थोड़ा सा कुछ पसंद करूंगा, कुछ इस तरह:
java.util.Arrays.asList(Object[] a);
कोई विचार?
मैं एक सरणी को जावा में सेट में बदलना चाहूंगा। ऐसा करने के कुछ स्पष्ट तरीके हैं (जैसे कि एक लूप के साथ), लेकिन मैं थोड़ा सा कुछ पसंद करूंगा, कुछ इस तरह:
java.util.Arrays.asList(Object[] a);
कोई विचार?
जवाबों:
ऐशे ही:
Set<T> mySet = new HashSet<>(Arrays.asList(someArray));
जावा 9+ में, यदि अचूक सेट ठीक है:
Set<T> mySet = Set.of(someArray);
जावा 10+ में, सामान्य प्रकार पैरामीटर को सरणियों घटक प्रकार से अनुमान लगाया जा सकता है:
var mySet = Set.of(someArray);
Arrays.asList
O (1) है।
Set<T> mySet = new HashSet<T>();
Collections.addAll(mySet, myArray);
कि JDK 6 से संग्रह .addAll (java.util.Collection, T ...) है।
इसके अतिरिक्त: क्या होगा यदि हमारी सरणी प्राइमेट से भरी हुई है?
JDK <8 के लिए, मैं केवल एक ही for
पास में रैप और ऐड-टू-सेट करने के लिए स्पष्ट लूप लिखूंगा ।
JDK> = 8 के लिए, एक आकर्षक विकल्प कुछ इस प्रकार है:
Arrays.stream(intArray).boxed().collect(Collectors.toSet());
java.util.Collections.addAll
। इसके अलावा, मैं अब कॉमन्स कलेक्शंस की सिफारिश नहीं करूंगा, इसके साथ क्या उत्पन्न नहीं हो रहा है और अमरूद मौजूदा है।
addAll
O ( n ) होगा।
अमरूद के साथ आप कर सकते हैं:
T[] array = ...
Set<T> set = Sets.newHashSet(array);
new HashSet<T>(Arrays.asList(someArray))
। Google.github.io/guava/releases/19.0/api/docs/com/google/common/…
जावा 8:
String[] strArray = {"eins", "zwei", "drei", "vier"};
Set<String> strSet = Arrays.stream(strArray).collect(Collectors.toSet());
System.out.println(strSet);
// [eins, vier, zwei, drei]
हमारे पास उपयोग करने का भी विकल्प है 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 ने Set.of
स्थैतिक कारखाना विधि की शुरुआत की जो प्रदत्त तत्वों या सरणी के लिए अपरिवर्तनीय सेट लौटाता है।
@SafeVarargs
static <E> Set<E> of(E... elements)
विवरण के लिए अपरिवर्तनीय सेट स्थैतिक फैक्टरी विधियों की जाँच करें ।
हम दो तरीकों से एक अपरिवर्तनीय सेट भी प्राप्त कर सकते हैं:
Set.copyOf(Arrays.asList(array))
Arrays.stream(array).collect(Collectors.toUnmodifiableList());
Collectors.toUnmodifiableList()
आंतरिक रूप से Set.of
जावा 9 में शुरू की गई विधि का उपयोग करता है । अधिक के लिए मेरा यह उत्तर भी देखें ।
Stream.of()
- मुझे नहीं पता था कि एक। के बारे में एक छोटी सी वक्रोक्ति Collectors.toSet()
: आप कहते हैं कि कल्पना एक-एक करके तत्वों को जोड़ने की गारंटी नहीं देती है, लेकिन इसका मतलब यह है कि: "संचित ... एक नए में Set
"। और यह अधिक पठनीय है - इसलिए मेरे दिमाग के लिए बेहतर है, अगर आपको ठोस प्रकार, परिवर्तनशीलता, क्रमबद्धता और थ्रेड-सुरक्षा की गारंटी की आवश्यकता नहीं है।
HashSet
। यह केवल गारंटी देता है कि यह एक होगा Set
और यही मेरा मतलब है। आशा है कि मैंने इसे स्पष्ट किया।
आपके द्वारा किए जाने के बाद आप Arrays.asList(array)
निष्पादित कर सकते हैंSet set = new HashSet(list);
यहाँ एक नमूना विधि है, आप लिख सकते हैं:
public <T> Set<T> GetSetFromArray(T[] array) {
return new HashSet<T>(Arrays.asList(array));
}
में ग्रहण संग्रह , निम्नलिखित काम करेंगे:
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();
नोट: मैं ग्रहण संग्रहों के लिए एक कमिटेटर हूं
जल्दी से: आप कर सकते हैं:
// 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()]);
मैंने ऊपर दी गई सलाह से नीचे लिखा है - इसे चोरी करें ... यह अच्छा है!
/**
* 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());
}
}
वहाँ महान जवाब का एक बहुत पहले से ही किया गया है, लेकिन उनमें से ज्यादातर पुरातन की सरणी के साथ काम नहीं करेगा (जैसे int[]
, long[]
, char[]
, byte[]
, आदि)
जावा 8 और इसके बाद के संस्करण में, आप सरणी को बॉक्स में रख सकते हैं:
Integer[] boxedArr = Arrays.stream(arr).boxed().toArray(Integer[]::new);
फिर धारा का उपयोग करके सेट में परिवर्तित करें:
Stream.of(boxedArr).collect(Collectors.toSet());
कुछ मानक पुस्तकालयों का उपयोग करने में बहुत मदद मिलती है। अपाचे कॉमन्स कलेक्शंस को देखने की कोशिश करें । इस मामले में आपकी समस्याएं बस कुछ इस तरह से बदल जाती हैं
String[] keys = {"blah", "blahblah"}
Set<String> myEmptySet = new HashSet<String>();
CollectionUtils.addAll(pythonKeywordSet, keys);
और यहाँ कलेक्शंस यूटिल्स जेवाडॉक है
java.util.Collections.addAll(myEmptySet, keys);
??
का उपयोग करें CollectionUtils
या ArrayUtils
सेstanford-postagger-3.0.jar
import static edu.stanford.nlp.util.ArrayUtils.asSet;
or
import static edu.stanford.nlp.util.CollectionUtils.asSet;
...
String [] array = {"1", "q"};
Set<String> trackIds = asSet(array);
में जावा 10 :
String[] strs = {"A", "B"};
Set<String> set = Set.copyOf(Arrays.asList(strs));
Set.copyOf
Set
दिए गए तत्वों से युक्त एक अपरिवर्तनीय रिटर्न देता है Collection
।
दिए गए Collection
नहीं होना चाहिए null
, और इसमें कोई null
तत्व नहीं होना चाहिए ।
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
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>()
new HashSet<Object>(Arrays.asList(Object[] a));
लेकिन मुझे लगता है कि यह अधिक कुशल होगा:
final Set s = new HashSet<Object>();
for (Object o : a) { s.add(o); }
HashSet
, उदाहरण के लिए, सरणी के आकार के आधार पर सेट की प्रारंभिक क्षमता है ।
Set<T> b = new HashSet<>(Arrays.asList(requiredArray));