我想创建一个方法,一次遍历任何字符串(一个字长)一个字符,并使用分隔符打印出新行上的每个字符。为此,我阅读了有关正则表达式(this post helped me the most for learning them)的所有内容,以及有关如何编译要在扫描程序中使用的模式的Java文档(here和here)。在了解了所有这些之后,我创建了以下代码:
public static void stringPrinter(String whole){
Pattern p = Pattern.compile(".{1}");
Scanner scan = new Scanner(whole);
scan.useDelimiter(p);
for (int i = 0; i < whole.length(); i++){
System.out.println(scan.next());
}
}
然后我用这一行对它进行了测试:
stringPrinter("okay");
现在在我脑海中,这应该如下工作:
whole
。p
的模式,该变量由任意一个字符组成。whole
。p
(因此它会在找到的每个字符后停止)。whole
中的字符完全相同。所以我希望输出&#39; o&#39;&#39;&#39;&#39; a&#39;和&#39; y&#39;每个人都有自己的路线。
但它给出的实际输出是:
.
Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at WholeNumber.stringPrinter(WholeNumber.java:37)
at WholeNumber.main(WholeNumber.java:28)
.
(除了没有那些句号。顶部只有三个空白行,下面有一个空行。我添加了这些句号,所以这里会显示空格。)
我认为堆栈跟踪与迭代一次额外的时间有关,但没有新的字符。即使我注释掉我的代码的倒数第二行(声明for循环),我仍然得到这个输出:
.
(只是一个空行)
有人可以帮我弄清楚发生了什么事吗?我真的不确定这个程序有什么问题。感谢任何帮助,所以提前感谢!
P.S。是的,我在发布此问题之前检查了this post。它确认了我的印象.
应检查任何字符,{1}
之后应确保它正在查找一个字符。
答案 0 :(得分:1)
有人可以帮我弄清楚发生了什么事吗?
不确定。事前注意:分隔模式".{1}"
等同于"."
(在定义元素出现一次时没有附加值。)
理解代码行为的关键是来自Scanner文档的这些句子:
next()
和hasNext()
方法...首先跳过与分隔符匹配的任何输入 模式,然后尝试返回下一个标记。 ...根据分隔模式的类型,空标记可能是 回。 ......划界 模式“\\ s”可以返回空标记,因为它只传递一个 一次空间。
因此,由于分隔模式与任何字符匹配,o
字符串中的每个字符(k
a
y
whole
)都是分隔符,并且中间的三个空标记由next()
返回。
要真正将每个字符作为标记,我们可以使用空分隔模式:.compile("")
。
答案 1 :(得分:-1)
您可以将字符串转换为string.toCharArray()
然后你可以迭代每个字符并打印出来