对于Java语言有些新意,我试图让自己熟悉一个可能遍历列表(或者可能是其他集合)以及每个集合的优点或缺点的所有方法(或者至少是非病态方法).
给定一个List<E> list对象,我知道以下循环所有元素的方法:
while/ do while循环以及)// Not recommended (see below)!
for (int i = 0; i < list.size(); i++) {
E element = list.get(i);
// 1 - can call methods of element
// 2 - can use 'i' to make index-based calls to methods of list
// ...
}
Run Code Online (Sandbox Code Playgroud)
注意:正如@amarseillan指出的那样,这种形式对于迭代Lists来说是一个糟糕的选择,因为该get方法的实际实现可能不如使用时那样有效Iterator.例如,LinkedList实现必须遍历i之前的所有元素以获得第i个元素.
在上面的例子中,List实现没有办法"保存它的位置"以使未来的迭代更有效.因为ArrayList它并不重要,因为复杂性/成本get是恒定时间(O(1)),而a LinkedList是它与列表的大小(O(n))成比例.
有关内置Collections实现的计算复杂性的更多信息,请查看此问题 …
我正在迁移一段代码以利用泛型.这样做的一个论点是for循环比跟踪索引或使用显式迭代器更清晰.
在大约一半的情况下,列表(ArrayList)通过今天使用索引以相反的顺序迭代.
有人可以建议一种更清洁的方式(因为我不喜欢indexed for loop使用集合时),虽然它确实有用吗?
for (int i = nodes.size() - 1; i >= 0; i--) {
final Node each = (Node) nodes.get(i);
...
}
Run Code Online (Sandbox Code Playgroud)
注意:我无法在JDK之外添加任何新的依赖项.
我使用过,LinkedHashMap因为重要的是键在地图中输入的顺序.
但现在我想首先获得key的值(第一个输入的条目)或最后一个.
如果有喜欢的方法first()和last()或类似的东西?
我是否需要一个迭代器才能获得第一个键入口?这就是我使用的原因LinkedHashMap!
谢谢!
对于前向迭代:
for (int i=0; i<pathElements.length; i++){
T pathElem = pathElements[i];
.......
}
Run Code Online (Sandbox Code Playgroud)
我可以将它编码为foreach:
for(T pathElem : pathElements){
.......
}
Run Code Online (Sandbox Code Playgroud)
是否有一个开关,以便foreach可以反向迭代?
for (int i=pathElements.length-1; i>=0; i--){
T pathElem = pathElements[i];
.......
}
Run Code Online (Sandbox Code Playgroud)
foreach中是否存在反向迭代开关?
(如果没有,你不认为JDK 8,9等包含这个功能会是一个令人兴奋的想法吗?)
LinkedList可以使用升序或降序迭代器迭代,如下所示:
LinkedList<Object> list = new LinkedList<Object>();
...
StringJoiner sJ1 = new StringJoiner(" ");
list.iterator().forEachRemaining(a -> sJ1.add(a.toString()));
System.out.println("averse: \n" + sJ1.toString());
StringJoiner sJ2 = new StringJoiner(" ");
list.descendingIterator().forEachRemaining(a -> sJ2.add(a.toString()));
System.out.println("reverse: \n" + sJ2.toString());
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)averse: Hello 2 Chocolate 10 reverse: 10 Chocolate 2 Hello
但是descendingIterator不适用于List和ArrayList.有没有在列表说明任何解决办法,或者为什么的descendingIterator缺席的名单?
问题类似于可以为java中的每个循环以相反的顺序执行吗?.但所有答案都建议使用临时解决方案或第三方库.
可能有使用溪流可能吗?(不幸的是,我的谷歌搜索只给出了流Java 8流逆序的缺失标准反转)
正如我所提到的,我的问题与关于流的问题有关,但是:
我有两个Java列表.首先,我想从头开始迭代,而另一个我想从头开始.我想为此使用增强型for循环,但我不确定如何做到这一点.有什么建议?
在今天的面试中被问到这个问题.我确定这是一个非常简单的技巧,但我想不出来.如何从一端到另一端遍历一个简单的Java数组(例如,为了从右到左聚合所有值的总和),而不使用"减"(-)符号(所以i--在循环中没有,或类似的东西) )?
编辑:我很确定它应该是一个不涉及Java特定结构的技巧(如Collections).不幸的是我以为我以后会自己想到它,所以我没有问到答案是什么:/
我得到ArrayList:
ArrayList logs;
for(Logs log : getLogs()){
logs.add(log.getName();
}
Run Code Online (Sandbox Code Playgroud)
我怎么能以相反的顺序得到这个列表?
java ×8
arraylist ×2
collections ×2
dictionary ×1
for-loop ×1
iteration ×1
java-8 ×1
linked-list ×1
loops ×1