import java.util.Scanner;
import java.util.ArrayList;
public class kek2 {
public static void main(String[] args) {
Scanner imeskanera = new Scanner(System.in);
ArrayList<String> wordlist = new ArrayList <String>();
while(true) {
System.out.println("Type a word: ");
String word = imeskanera.nextLine();
int lenght =wordlist.size();
if(word.equals("")) {
for(int i = 0;i<lenght; i++) {
System.out.println(wordlist.get(lenght-i));}
break;
}
wordlist.add(word);
}
}
}
我试图以相反的顺序打印数组,但我在
(lenght-i)
部分遇到错误,一切看起来都很好,我是否做错了 Java 不允许的事情?
最好将
while
循环限制为读取输入,并在用户完成后以任何所需的顺序打印列表内容。
Scanner imeskanera = new Scanner(System.in);
List<String> wordlist = new ArrayList<>();
String word;
System.out.println("Type a word: ");
while(!(word = imeskanera.nextLine()).isEmpty()) {
wordlist.add(word);
System.out.println("Type a word: ");
}
for (int i = wordlist.size(); i-- > 0;) { // index decremented in condition
System.out.println(wordlist.get(i));
}
或者
ListIterator
可以使用 List::listIterator
检索,并且它的方法 hasPrevious()
/ previous()
可用于反向迭代 - 然而,无论如何,列表的大小是需要的:
for (ListIterator i = wordlist.listIterator(wordlist.size()); i.hasPrevious();) {
System.out.println(i.previous());
}
给定代码中存在off-by-one错误。与其调用
wordlist.get(lenght-i)
,不如调用 wordlist.get(lenght-i-1)
。
for(int i = 0; i < lenght; i++) {
System.out.println(wordlist.get(lenght-i-1));
}
对此进行推理的一个简单方法是测试边界值,并查看它们如何映射。在这种情况下,当
i
为零时,lenght-i
= lenght
。由于列表是零索引的,因此可用于 List.get
的最大索引比长度小一。由于目标是从列表的最后一个元素开始,因此从此值中减一 (lenght-i-1
) 从正确的索引开始。