在不知道长度的情况下无法获取 arrayList 中的最后一个元素

问题描述 投票:0回答:2
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 不允许的事情?

java arrays arraylist
2个回答
3
投票

最好将

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());
}

0
投票

给定代码中存在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
) 从正确的索引开始。

© www.soinside.com 2019 - 2024. All rights reserved.