如何在Java中将StringTokenizer的结果转换为ArrayList?

3

我想将 StringTokenizer 的结果转换为 ArrayList。我使用了以下代码,在第一个打印语句中,stok.nextToken() 打印出正确的值。但是,在第二个打印语句中,转换为 ArrayList 时出现错误,显示 java.util.NoSuchElementException。 我该如何将这些结果转换为 ArrayList?

 import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.StringTokenizer;

        public class Test {
        public static void main(String[] args) throws java.io.IOException {

            ArrayList<String> myArray = new ArrayList<String>();
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            System.out.print("Enter : ");
            String s = br.readLine();
            StringTokenizer stok = new StringTokenizer(s, "><");
            while (stok.hasMoreTokens())
                System.out.println(stok.nextToken()); 
            // -------until now ok

            myArray.add(stok.nextToken()); //------------???????????
            System.out.println(myArray);

        }
    }

1
看看你的 while 语句。如果执行退出循环,那对于 stok 意味着什么? - Savior
非常感谢您的回复。那么,我该如何将这个结果放入ArrayList中呢? - Emalka
1
stok已经被while循环完全读取,因此在循环完成后调用nextToken()将会抛出(数据结束)错误。你是想在循环内部调用add()吗?如果是的话,你可能缺少一些{大括号}。否则,你想做什么?编辑问题并解释清楚。 - Andreas
2个回答

7
引用StringTokenizer的javadoc:

StringTokenizer是一个过时的类,为了兼容性而保留,但在新代码中不建议使用它。建议寻找此功能的任何人改用Stringsplit方法或java.util.regex包。

“新代码”指的是为Java 1.4或更高版本编写的任何内容,即古老时期。
while循环将从tokenizer提取所有值。当您在已经提取了所有标记后调用nextToken(),为什么会出现异常,这让您感到惊讶呢?
特别是考虑到nextToken()的javadoc中的以下引用:

如果在此分词器的字符串中没有更多标记,则抛出NoSuchElementException

您是不是可能想要这样做?
ArrayList<String> myArray = new ArrayList<>();
StringTokenizer stok = new StringTokenizer(s, "><");
while (stok.hasMoreTokens()) {
    String token = stok.nextToken(); // get and save in variable so it can be used more than once
    System.out.println(token); // print already extracted value
    // more code here if needed
    myArray.add(token); // use already extracted value
}
System.out.println(myArray); // prints list

谢谢您的回复。我错过了 while 的 {括号}。 - Emalka
1
你不仅仅是漏掉了大括号。add()函数调用没有缩进,所以你甚至没有展示出代码的意图。对于人类读者来说,缩进非常重要。根据问题中的代码编写,甚至不清楚你想让代码做什么。漏掉大括号只是其中最小的问题。 - Andreas

1
ArrayList<String> myArray = new ArrayList<String>();        
while (stok.hasMoreTokens()){
myArray.add(stok.nextToken());
}

请勿在 while 循环外调用 stock.nextToken,否则会导致异常。使用 System.out.println 打印 ArrayList 不会有帮助,你需要使用 for 循环来遍历它。
for(String s : myArray){
System.out.Println(s);
}

不知道我的评论去哪了,但打印ArrayList不会给你内存位置。它将打印列表的所有元素。即使它没有,它也不会打印内存位置,因为像List@5ad6521c这样的输出是哈希码,而不是内存位置! - Andreas
你在注释中从未提到过这一点。期待您的回复,谢谢。 - Priyamal
我做过,而且我会再次做到:它将打印列表中的所有字符串。它不会打印哈希码。 - Andreas
是的,输出将在[]中打印。再次感谢。 - Priyamal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接