2011-06-20 13 views
9

मैं पहचानकर्ता द्वारा एक सूची में नेविगेट करना चाहता हूं।जावा सूची: पहचानकर्ता से अगले या पिछले तत्व प्राप्त करें

1- मैं एक सूची प्रबंधित/बनाता हूं।

2- मैं अपने सूची में से एक पहचानकर्ता तत्व के अगले आइटम प्राप्त करने के लिए समारोह बनाने

आप मुझे इस कोड को ठीक करने में मदद कर सकते हैं?

अपने तत्वों को दोहराया नहीं कर रहे हैं सूची

List<String> myList = new ArrayList<String>(); 
myList.add("1"); 
myList.add("2"); 
myList.add("3"); 
myList.add("4"); 
myList.add("5"); 


public String function getNext(String uid) { 

    if (myList.indexOf(uid).hasNext()) { 
     return myList.indexOf(uid).nextElement(); 
    } 
    return ""; 
} 

public String function getPrevious(String uid) { 
    return myList.indexOf(uid).hasPrevious() ? myList.indexOf(uid).previousElement() : ""; 
} 

उत्तर

10

आप अपने स्ट्रिंग को देखने के लिए एक इंडेक्स का उपयोग कर सकते हैं जो कि आपके पास जितनी जल्दी हो सके कार्यों को कार्यान्वित करने के लिए तेज़ और सरल है।

public String getNext(String uid) { 
    int idx = myList.indexOf(uid); 
    if (idx < 0 || idx+1 == myList.size()) return ""; 
    return myList.get(idx + 1); 
} 

public String getPrevious(String uid) { 
    int idx = myList.indexOf(uid); 
    if (idx <= 0) return ""; 
    return myList.get(idx - 1); 
} 

एक List.get(i) का उपयोग O(1) जो सूचकांक सबसे तेजी से विकल्प रखने बनाता है। List.indexOf(String)O(n) है। NavigatbleSet का उपयोग करना आकर्षक दिखाई दे सकता है क्योंकि यह O(log n) है, हालांकि ऑब्जेक्ट बनाने की लागत इतनी अधिक है कि लाभ देखने से पहले संग्रह काफी बड़ा होना चाहिए। (इस मामले में आप पहले विकल्प का उपयोग करेंगे)

+1

बहुत ही सुरुचिपूर्ण समाधान –

+0

केवल चेतावनी के साथ * indexOf * एक * ओ (एन) * ऑपरेशन है, लेकिन, yup, +1। – SyntaxT3rr0r

+0

@ सिंटेक्सटी 3rr0r, अच्छा बिंदु। यही कारण है कि सूचकांक को बनाए रखना बेहतर है क्योंकि 'List.get (int) '' O (1)' है, यह कोड को भी सरल बना सकता है। –

1

तैयार, आप क्या जरूरत है एक NavigableSet है:

http://download.oracle.com/javase/6/docs/api/java/util/NavigableSet.html

तरीकों higher और lower आप के लिए क्या देख रहे हैं।

+0

NavigableSet सॉर्टेडसेट बढ़ाता है। यह ओपी के बाद नहीं है: NavigableSet उसे क्रमबद्ध क्रम में अगला तत्व देगा, प्रविष्टि आदेश में नहीं। ओपी पीटर लॉरी ने जवाब के रूप में क्या दिया है: एक विधि उसे सम्मिलन आदेश में अगला/पिछला तत्व दे रही है। – SyntaxT3rr0r

+0

@ SyntaxT3rr0r उदाहरण तत्वों में पुनरावृत्ति के बिना लेक्सिकोोग्राफ़िकल क्रम में डाला गया है, इसलिए यह एक उचित धारणा थी कि वह एक सूची का उपयोग कर चूक गया था जब उसे वास्तव में एक क्रमबद्ध सेट था ... आप जानते हैं, जब आपको मिला हथौड़ा, सब कुछ एक नाखून की तरह दिखता है। – fortran

+0

क्या आप किसी भी तरह से यह कहने की कोशिश कर रहे हैं कि सभी ओपी जानता है कि हथौड़ा होगा? वह बहुत कठोर होगा। यह भी विडंबनापूर्ण होगा कि आप - जो हथौड़ा से ज्यादा जानता है - यह नहीं पता कि हथौड़ा से अधिक का उपयोग कब करें और कब नहीं। एक फर्जी जवाब एक फर्जी जवाब है: इसे अपने पक्ष में मोड़ने की कोशिश मत करो। – SyntaxT3rr0r

1

सूचियों में nextElement() विधि नहीं है। indexOf आइटम की पूर्णांक अनुक्रमणिका देता है। आप बस एक अगली (या पिछली) आइटम प्राप्त करने के लिए जोड़ सकते हैं (या घटाना):

public String function getNext(String uid) { 
    var index = myList.indexOf(uid); 
    if (index > -1) { 
    try { 
     return myList.get(i+1); 
    } catch (IndexOutOfBoundsException e) { 
     // Ignore 
    } 
    } 
    return ""; // consider returning `null`. It's usually a better choice. 
} 

हालांकि ArrayList पर indexOf के साथ एक वस्तु को देख, एक बहुत ही धीमी प्रक्रिया है यह हर एक प्रविष्टि की जांच करने के लिए है, क्योंकि। इसके लिए बेहतर तरीके हैं, लेकिन यह उस पर निर्भर करता है जो आप वास्तव में प्राप्त करने की कोशिश कर रहे हैं।

संबंधित मुद्दे