2011-06-20 35 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查找对象是一个非常缓慢的过程,因为它必须检查每一个条目。对此有更好的方法,但这取决于你实际想要达到的目标。

相关问题