अगर मेरे पास कोई संग्रह है, जैसे कि Collection<String> strs
, मैं पहला आइटम कैसे प्राप्त कर सकता हूं? मैं बस एक कॉल कर सकते हैं Iterator
, पहले ले लो next()
, फिर Iterator
दूर फेंक । क्या इसे करने का तरीका कम बेकार है?
अगर मेरे पास कोई संग्रह है, जैसे कि Collection<String> strs
, मैं पहला आइटम कैसे प्राप्त कर सकता हूं? मैं बस एक कॉल कर सकते हैं Iterator
, पहले ले लो next()
, फिर Iterator
दूर फेंक । क्या इसे करने का तरीका कम बेकार है?
जवाबों:
Iterables.get (yourC, indexYouWant)
क्योंकि वास्तव में, यदि आप संग्रह का उपयोग कर रहे हैं, तो आपको Google संग्रह का उपयोग करना चाहिए।
ऐसा लगता है कि यह करने का सबसे अच्छा तरीका है:
String first = strs.iterator().next();
शानदार सवाल ... सबसे पहले, यह Collection
इंटरफ़ेस के लिए एक निरीक्षण जैसा लगता है।
ध्यान दें कि "पहला" हमेशा आपके द्वारा संग्रह में रखी गई पहली चीज़ वापस नहीं करेगा, और केवल ऑर्डर किए गए संग्रह के लिए समझ में आ सकता है। शायद यही कारण है कि एक get(item)
कॉल नहीं है , क्योंकि ऑर्डर जरूरी संरक्षित नहीं है।
हालांकि यह थोड़ा बेकार लग सकता है, यह उतना बुरा नहीं हो सकता जितना आप सोचते हैं। Iterator
वास्तव में सिर्फ संग्रह है, न कि आम तौर पर एक पूरा संग्रह की कॉपी में अनुक्रमण जानकारी शामिल है। इस विधि को लागू करने से Iterator
वस्तु का तात्पर्य होता है , लेकिन यह वास्तव में केवल उपरि है (सभी तत्वों की नकल की तरह नहीं)।
उदाहरण के लिए, ArrayList<String>.iterator()
विधि द्वारा लौटाए गए प्रकार को देखते हुए, हम देखते हैं कि यह है ArrayList::Itr
। यह एक आंतरिक वर्ग है जो सिर्फ सूची के तत्वों को सीधे कॉपी करने के बजाय एक्सेस करता है।
बस सुनिश्चित करें कि आप वापसी की जांच करेंगे iterator()
क्योंकि यह खाली हो सकता है या null
कार्यान्वयन के आधार पर हो सकता है ।
जावा 8 में:
Optional<String> firstElement = collection.stream().findFirst();
जावा के पुराने संस्करणों के लिए, अमरुद Iterables में एक गेटफर्स्ट विधि है :
Iterables.getFirst(iterable, defaultValue)
getFirst
विधि उपलब्ध नहीं है । कर रहे हैं get
और getLast
तरीकों
इसमें "पहले" आइटम जैसी कोई चीज नहीं है Collection
क्योंकि यह है .. अच्छी तरह से बस एक संग्रह।
Java doc के Collection.iterator () विधि से:
उस आदेश से संबंधित कोई गारंटी नहीं है जिसमें तत्व वापस किए गए हैं ...
तो तुम नहीं कर सकते।
यदि आप सूची जैसे किसी अन्य इंटरफ़ेस का उपयोग करते हैं , तो आप निम्न कार्य कर सकते हैं:
String first = strs.get(0);
लेकिन सीधे एक संग्रह से यह संभव नहीं है।
get(int n)
के लिए परिभाषित किया गया हैCollection
ऐसा लगता है कि आपका संग्रह सूची जैसा होना चाहता है, इसलिए मैं सुझाव दूंगा:
List<String> myList = new ArrayList<String>();
...
String first = myList.get(0);
उदाहरण के लिए जावा 8 में आपके पास कुछ ऑपरेटर हैं, उदाहरण के लिए
/**
* Operator that limit the total number of items emitted through the pipeline
* Shall print
* [1]
* @throws InterruptedException
*/
@Test
public void limitStream() throws InterruptedException {
List<Integer> list = Arrays.asList(1, 2, 3, 1, 4, 2, 3)
.stream()
.limit(1)
.collect(toList());
System.out.println(list);
}
अमरूद एक प्रदान करता है onlyElement
Collector
, लेकिन इसका उपयोग केवल तभी करें जब आप संग्रह में बिल्कुल एक तत्व होने की उम्मीद करते हैं।
Collection<String> stringCollection = ...;
String string = collection.stream().collect(MoreCollectors.onlyElement())
यदि आप अनिश्चित हैं कि कितने तत्व हैं, तो उपयोग करें findFirst
।
Optional<String> optionalString = collection.stream().findFirst();
आप एक कास्टिंग कर सकते हैं। उदाहरण के लिए, यदि इस परिभाषा के साथ एक विधि मौजूद है, और आप जानते हैं कि यह विधि एक सूची लौटा रही है:
Collection<String> getStrings();
और इसे लागू करने के बाद, आपको पहले तत्व की आवश्यकता है, आप इसे इस तरह से कर सकते हैं:
List<String> listString = (List) getStrings();
String firstElement = (listString.isEmpty() ? null : listString.get(0));
यदि आप जानते हैं कि संग्रह एक कतार है तो आप संग्रह को एक कतार में डाल सकते हैं और इसे आसानी से प्राप्त कर सकते हैं।
कई संरचनाएं हैं जिन्हें आप ऑर्डर प्राप्त करने के लिए उपयोग कर सकते हैं, लेकिन आपको इसे डालना होगा।
यह पूरी तरह से इस बात पर निर्भर करता है कि आपने किस कार्यान्वयन का उपयोग किया है, चाहे सरणी लिस्टलिस्ट, या सेट के अन्य कार्यान्वयन।
यदि इसे सेट किया जाता है तो आप सीधे पहला तत्व प्राप्त कर सकते हैं, उनके संग्रह पर ट्रिक लूप हो सकता है, मान 1 का एक वैरिएबल बनाएं और उस लूप को तोड़ने के बाद ध्वज मान 1 होने पर मान प्राप्त करें।
यदि यह सूची का कार्यान्वयन है तो सूचकांक संख्या को परिभाषित करना आसान है।
कार्यात्मक तरीका:
public static <T> Optional<T> findFirst(List<T> result) {
return Optional.ofNullable(result)
.map(List::stream)
.flatMap(Stream::findFirst);
}
कोड स्निपेट NullPointerException और IndexOutOfBoundsException से संरक्षित है
List<T>
इस शर्त को संतुष्ट नहीं करती है कि इसे अतिरिक्त के साथ काम करना चाहिए Collection<String>
, लेकिन निश्चित रूप से इसका उपयोग करके तय किया जा सकता है :। Collection<T>
.map(Collection::stream)
आप ऐसा कर सकते हैं:
String strz[] = strs.toArray(String[strs.size()]);
String theFirstOne = strz[0];
संग्रह के लिए javadoc सरणी के तत्वों के निम्नलिखित चेतावनी wrt आदेश देता है:
यदि यह संग्रह इस बात की कोई गारंटी देता है कि इसके तत्व द्वारा किस तत्व को वापस किया जाता है, तो इस विधि को उसी क्रम में तत्वों को वापस करना होगा।