如何从 Scanner 中分离字符串并将每个单词存储在 ArrayList 中?

ow to separate a string from Scanner and store each word in an ArrayList?

提问人:Oleg Khandozhko 提问时间:5/30/2023 最后编辑:Mark RotteveelOleg Khandozhko 更新时间:6/2/2023 访问量:80

问:

如何以拆分方式将字符串从扫描仪添加到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。

字符串 数组列表 java.util.scanner

评论

5赞 Elliott Frisch 5/30/2023
String [] values = line.split("//s+");应该是(是的,这很重要)。String [] values = line.split("\\s+");
0赞 WJS 6/1/2023
你试过吗?如果您使用的是 Mac,它是CTRL + Dcommand D
0赞 Oleg Khandozhko 6/1/2023
不,我没有使用 ctrl-d。谢谢。

答:

0赞 Md Masud Rana 5/30/2023 #1
 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);

试试这个,希望它能正常工作。

0赞 AztecCodes 5/30/2023 #2

Java 正则表达式问题

该方法中使用的正则表达式不适用于 JavaJava 反斜杠中的字符串文字被视为转义字符。因此,您必须转义反斜杠本身。您可以通过编写而不是 .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());
  }
}

评论

0赞 Oleg Khandozhko 6/1/2023
哈。很好。所以我的代码因为 \\s+ - //s+ 而不起作用。好。
0赞 AztecCodes 6/1/2023
@OlegKhandozhko 这是正则表达式的诅咒。您为被允许使用正则表达式而致以崇高的敬意。
0赞 WJS 5/30/2023 #3

你的第一种方法很好。

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 platformsCTRL

命令行输入期间的信号 EOF 允许无限量的输入。

-1赞 Reilas 6/1/2023 #4

在面向对象编程中,有一个称为阻塞的概念。

当源对象可以向另一个对象提供动态数据并等待数据时,就会发生这种情况。

例如,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]