提问人:Oleg Khandozhko 提问时间:5/30/2023 最后编辑:Mark RotteveelOleg Khandozhko 更新时间:6/2/2023 访问量:80
如何从 Scanner 中分离字符串并将每个单词存储在 ArrayList 中?
ow to separate a string from Scanner and store each word in an ArrayList?
问:
如何以拆分方式将字符串从扫描仪添加到ArrayList?
首先我尝试了这个:
Scanner sc = new Scanner(System.in);
ArrayList<String> yourList = new ArrayList<>();
while (sc.hasNext()) {
yourList.add(sc.next());
}
但是由于sc.next,当我按回车键时,它会无休止地移动。 之后,我尝试了如下(+scanner+arrayList):
String line = input.nextLine();
String [] values = line.split("//s+");
for (String a : values){
yourList.add(a);
}
但这也是错误的。所有内容都将在第一个索引中。
作为输出,它应该从 Scanner 获取 String(例如 - “I love my job but i am a good lier”),并且作为输出,每个单词都应该在 ArrayList 中。
I
love
my
job
etc..
如果我在这里使用 .size(),它应该是 10。
答:
Scanner sc = new Scanner(System.in);
String str=sc.nextLine();
ArrayList<String> yourList = new ArrayList<>();
String[] splited = str.split("\\s+");
for(String a: splited){
yourList.add(a);
}
System.out.println(yourList);
试试这个,希望它能正常工作。
Java 正则表达式问题
该方法中使用的正则表达式不适用于 Java。
Java 反斜杠中的字符串文字被视为转义字符。因此,您必须转义反斜杠本身。您可以通过编写而不是 .split()
\
\\s
\s
示例代码:
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
/**
* Main method
*
* @param args Parameters passed into terminal
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Enter your sentence: ");
// Read user input in console
String line = sc.nextLine();
ArrayList <String> yourList = new ArrayList <> ();
// Split line into words - Important difference - this line of code fixes your problem
String[] values = line.split("\\s+");
// Foreach-loop - Every word gets added to the ArrayList
for (String value: values) {
yourList.add(value);
}
System.out.println("The size of your list is: " + yourList.size());
}
}
评论
你的第一种方法很好。
Scanner sc = new Scanner(System.in);
ArrayList<String> yourList = new ArrayList<>();
while (sc.hasNext()) {
yourList.add(sc.next());
}
诀窍是告诉没有更多的条目。您需要键入表示文件结束 (EOF) 的控制字符。hasNext()
- Eclipse 控制台是 CTRL+Z。
- Unix/Linux 应该是 CTRL+D。
- Windows cmd 窗口,它是 CTRL+Z,然后是 Return。
- 对于 IntelliJ,它是 CTRL + D。
- 其他输入设备可能具有不同的 EOF 信号方式。
- 在您可能需要使用而不是
Mac platforms
⌘
CTRL
命令行输入期间的信号 EOF 允许无限量的输入。
在面向对象编程中,有一个称为“阻塞”的概念。
当源对象可以向另一个对象提供动态数据并等待数据时,就会发生这种情况。
例如,TCP/IP 连接(服务器和客户端)是 TCP/IP 连接。
服务器将阻止或等待数据,然后再将其发送到客户端。
因此,如果客户端调用数据,而服务器没有调用,则会发生阻塞 - 客户端将等待。
当将 System.in 作为源时,Scanner 类也会发生类似的情况。
默认情况下,将针对多个方法(在本例中为 next,以及 hasNext)进行阻塞。
请注意,当 Scanner 源为 String 时,不会发生这种情况。
例如,这不会阻止。
Scanner scanner = new Scanner("I love my job but i am a good lier");
while (scanner.hasNext()) System.out.println(scanner.next());
切换到 Scanner#nextLine 是一个更好的选择,因为在提交行时不会发生阻塞。
此外,您有正确的 Java 代码,但正则表达式模式不正确。
编写正则表达式模式的概念本身就是一项任务,因为语法可能非常复杂,有时几乎太陈旧而无法破译。
我建议查看维基百科上关于正则表达式的文章,因为它提供了语法的完整概述。
如果您熟悉基本的编码语法,则不难理解。
Wikipedia – 正则表达式。
在代码中,使用了错误的 solidus 字符。
line.split("//s+");
应该是
line.split("\\s+")
如果我运行以下代码,我将获得有效的输出。
List<String> yourList = new ArrayList<>();
Scanner input = new Scanner(System.in);
String line = input.nextLine();
String [] values = line.split("\\s+");
for (String a : values){
yourList.add(a);
}
System.out.println(yourList);
输入
I love my job but i am a good lier
输出
[I, love, my, job, but, i, am, a, good, lier]
评论
String [] values = line.split("//s+");
应该是(是的,这很重要)。String [] values = line.split("\\s+");
CTRL + D
command D