我想按标识符导航到列表。
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() : "";
}
答案 0 :(得分:12)
您可以使用索引来查找您的String,这样可以更快更简单地实现这些功能。
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 :(得分:1)
如果您的元素没有重复,您需要的是NavigableSet:
http://download.oracle.com/javase/6/docs/api/java/util/NavigableSet.html
您正在寻找方法higher
和lower
。
答案 2 :(得分: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.
}
然而,在indexOf
上查找ArrayList
的对象是一个非常缓慢的过程,因为它必须检查每个条目。有更好的方法,但这取决于你实际想要实现的目标。