2011-06-20 39 views
9

我想導航到標識符爲的列表中。Java列表:從標識符中獲取下一個或上一個元素

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 *是一個* O(n)*操作但是,yup,+1的警告。 – SyntaxT3rr0r

+0

@ SyntaxT3rr0r,好點。這就是爲什麼保留索引更好,因爲'List.get(int)'是'O(1)'它可能使代碼更簡單。 –

1

如果不重複的元素,你需要的是的NavigableSet:

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

的方法higherlower是你在找什麼。

+0

NavigableSet擴展SortedSet。這不是OP後面的內容:NavigableSet應按照排序順序給他下一個元素,否按順序排列。 OP是在Peter Lawrey給出的答案之後:一種方法爲他提供插入順序中的下一個/前一個元素。 – SyntaxT3rr0r

+0

@ SyntaxT3rr0r在示例中,元素按字典順序插入,沒有重複,所以這是一個公平的假設,他錯過了使用列表,當他真正需要的是一個有序集合...你知道,當你得到的只是一個錘子,一切看起來像釘子。 – fortran

+0

你是否想要暗示所有的OP知道會是一把錘子?這將是非常粗魯的。如果你知道的不僅僅是錘子,也不會知道何時使用比錘子更多的時間,什麼時候不使用。一個假的答案是一個假的答案:不要試圖扭轉這對你有利。 – 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. 
} 

然而,隨着indexOfArrayList查找對象是一個非常緩慢的過程,因爲它必須檢查每一個條目。對此有更好的方法,但這取決於你實際想要達到的目標。

相關問題