【问题标题】:How to take StringTokenizer result to ArrayList in Java?java - 如何将StringTokenizer结果带到Java中的ArrayList?
【发布时间】:2016-04-27 15:54:29
【问题描述】:

我想将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);

        }
    }

【问题讨论】:

  • 查看您的while 声明。如果执行退出循环,这对stok 意味着什么?
  • 非常感谢您的回复。那么,我将如何将此结果放入 ArrayList 中?
  • stok 已被 while 循环完整读取,因此在循环完成后调用 nextToken() 当然会引发(数据结束)错误。您是否打算在循环内调用add()?如果是这样,您缺少一些 {braces}。否则,您要做什么?编辑问题并解释。

标签: java arraylist stringtokenizer


【解决方案1】:

引用StringTokenizer的javadoc:

StringTokenizer 是一个遗留类,出于兼容性原因保留,尽管不鼓励在新代码中使用它。建议任何寻求此功能的人使用 Stringsplit 方法或 java.util.regex 包。

“新代码”是指为 Java 1.4 或更高版本编写的任何内容,即古代。


while 循环将从标记器中提取所有值。当您在提取所有令牌之后调用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

【讨论】:

  • 感谢您的回复。我错过了 {braces} 一段时间。
  • 你不只是错过了大括号。 add() 调用没有缩进,因此您甚至没有显示代码的 intent。缩进对于代码的人类读者来说非常重要。由于代码是在问题中编写的,因此您甚至不清楚您想要代码做什么。缺少大括号是最小的问题。
【解决方案2】:
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 这样的输出是哈希码,而不是内存位置!!
  • 你从来没有在 cmets 中提到过。感谢您的回复谢谢。
  • 我做了,我会再做一次:它会打印列表中的所有字符串。它不会打印哈希码。
  • 是的,输出将在 [] 内打印。再次感谢您
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-19
  • 1970-01-01
  • 2013-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多