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

gudnpqoy  于 2023-06-04  发布在  Java
关注(0)|答案(4)|浏览(145)

如何将Scanner中的字符串拆分到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利耶”),并且作为输出,每个单词都应该在ArrayList中。

I
love
my 
job
etc..

如果我在这里使用.size(),它应该是10。

ohfgkhjo

ohfgkhjo1#

Java正则表达式问题

您在split()方法中使用的RegexJava不正确。Java\反斜杠中的字符串文字被视为转义字符。因此,你必须转义反斜杠本身。您可以通过编写\\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());
  }
}
8i9zcol2

8i9zcol22#

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);

试试这个,希望效果很好。

nsc4cvqm

nsc4cvqm3#

你的第一个方法很好。

Scanner sc = new Scanner(System.in);
ArrayList<String> yourList = new ArrayList<>();
while (sc.hasNext()) {
     yourList.add(sc.next());
}

诀窍是告诉hasNext()没有更多的条目。您需要键入表示文件结束(EOF)的控制字符。

  • 在Eclipse控制台上,它是CTRL+Z。
  • Unix/Linux应该是CTRL+D。
  • 在Windows cmd窗口中,它的CTRL+Z后跟回车。
  • 对于IntelliJ,它是CTRL + D。
  • 其他输入设备可以具有用信号通知EOF的不同方式。
  • Mac platforms上,您可能需要使用而不是CTRL

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

uelo1irk

uelo1irk4#

在面向对象编程中,有一个概念叫做“blocking”。
当源对象可以向另一个对象提供动态数据,并且正在等待数据时,就会发生这种情况。
一个示例情况是 TCP/IP 连接-一个服务器和一个客户端。
服务器将在将数据发送到客户端之前“阻止”或等待数据。
因此,如果客户端发出一个获取数据的调用,而服务器没有数据,那么就会发生 * 阻塞 -客户端将等待。
当 * System.in * 作为源代码时,
Scanner * 类也会发生类似的情况。
默认情况下,blocking 将在几个方法上发生-在本例中是 *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]

相关问题