सबलिस्ट () का उपयोग कैसे करें


79

मेरे पास एक JSF पेज है जो ग्लासफिश लॉग फाइलों की सूची प्रदर्शित करता है। मैं पेजेशन के लिए आलसी लोडिंग का उपयोग करता हूं। मैं जावा में लॉग फ़ाइलों के नामों की सूची रखता हूं List

private List<directoryListObj> dataList = new ArrayList<>();

dataList = dataList.subList(firstRow, lastRow);

और यहाँ समस्या है। उदाहरण के लिए मेरे पास निर्देशिका में 35 फाइलें हैं। जब मैं ऐसा करता हूं

dataList = dataList.subList(5, 15);

यह बढ़िया काम करता है। लेकिन जब मैं ऐसा करता हूं:

dataList = dataList.subList(30, 38);

मुझे त्रुटि इंडेक्स मिलता है क्योंकि मैं सूची के बाहर इंडेक्स प्राप्त करना चाहता हूं। मैं उदाहरण के लिए सूची के तत्वों को 30 से 35 तक कैसे लौटा सकता हूं? मैं चाहता हूं कि अगर मैं ३० से ४० तक इंडेक्स प्राप्त करना चाहता हूं लेकिन केवल ३५ इंडेक्स प्राप्त करने के लिए केवल ५।


13
dataList = dataList.subList(30, 38 > dataList.size() ? dataList.size() : 38);
pb2q

18
याdataList.subList(30, Math.min(38, dataList.size())
इस्माइल बदावी

1
@ pb2q ऐसा लगता है जैसे आपने उत्तर के लिए मौका खो दिया है।
लुइगी मेंडोज़ा

यदि आप एपीआईडॉक को देखते हैं तो आप देखेंगे कि यह फेंकता है IndexOutOfBoundsException - endpoint index value out of range (fromIndex < 0 || toIndex > size)। तो भविष्य में ऐसे संकेत के लिए एपीआईडॉक को देखें।
zeller

जवाबों:


97

उपयोग subList(30, 38);करना विफल हो जाएगा क्योंकि अधिकतम 38 सूची में उपलब्ध नहीं है, इसलिए यह संभव नहीं है।

सबलिस्ट के लिए पूछने से पहले केवल एक ही तरीका हो सकता है, आप सूची आकार () पद्धति का उपयोग करके अधिकतम सूचकांक को स्पष्ट रूप से निर्धारित करते हैं।

उदाहरण के लिए, आकार की जांच करें, जो 35 देता है, इसलिए कॉल करें sublist(30, size());

या

Pb2q टिप्पणी से नकल की

dataList = dataList.subList(30, 38 > dataList.size() ? dataList.size() : 38);

6
यह भी विफल होगा अगर सूची में 30 से कम आइटम हैं।
हैरोल्डो_को

@ हेरोल्डो_ओक: हाँ आप सही हैं, लेकिन मान लिया गया कि सूची में 30 से अधिक आइटम हैं।
कोसा

3
मैं पसंद करता हूंdataList = dataList.subList(30, Math.min(38, dataList.size()));
बेनी बोटेमा

46

मैंने इसे लागू किया है और इसका परीक्षण किया है; यह अधिकांश आधारों को कवर करना चाहिए:

public static <T> List<T> safeSubList(List<T> list, int fromIndex, int toIndex) {
    int size = list.size();
    if (fromIndex >= size || toIndex <= 0 || fromIndex >= toIndex) {
        return Collections.emptyList();
    }

    fromIndex = Math.max(0, fromIndex);
    toIndex = Math.min(size, toIndex);

    return list.subList(fromIndex, toIndex);
}

4
यह स्वीकृत उत्तर होना चाहिए, केवल वही जो अपने कोड का परीक्षण करने के लिए परेशान हो।
एड रान्डल

2
बहुत मददगार, धन्यवाद। एक विधि में इसे तोड़ना टर्नरी ऑपरेटरों में तर्क को लपेटने की कोशिश करने से अधिक समझ में आता है, बस उस तरीके को पढ़ना बहुत कठिन हो जाता है।
स्टीव

43

अंतिम तत्व प्राप्त करने के लिए, बस दूसरे पैरामीटर के रूप में सूची के आकार का उपयोग करें। उदाहरण के लिए, यदि आपके पास 35 फाइलें हैं, और आप अंतिम पांच चाहते हैं, तो आप ऐसा करेंगे:

dataList.subList(30, 35);

ऐसा करने का एक सुरक्षित तरीका है:

dataList.subList(Math.max(0, first), Math.min(dataList.size(), last) );

4
यह भी विफल होगा अगर 'पहले' सूची के आकार से अधिक है।
हैरोल्डो_को

3
@Haroldo_OK: या यदि lastनकारात्मक है!
टैगिर वलेव

यह भी विफल हो जाएगा अगरfirst >= last
पुनर्खरीद

7

आप जावा 8 में स्ट्रीम का उपयोग कर सकते हैं। हमेशा सबसे अधिक 10 प्रविष्टियां प्राप्त करने के लिए, आप यह कर सकते हैं:

dataList.stream().skip(5).limit(10).collect(Collectors.toList());
dataList.stream().skip(30).limit(10).collect(Collectors.toList());
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.