我需要编写一个方法来接受用户输入的汽车规格,并将它们添加到ArrayList中.这需要接受用户想要输入的任何数量的规范,包括一个也不接受. 这是我在这里的第一篇帖子,所以对任何糟糕的语法表示歉意.

public static ArrayList getTrim() {

Scanner t = new Scanner(System.in);
System.out.println("Enter car trim");
ArrayList<String> trim = new ArrayList<>();

while (t.hasNext()) {
trim.add(t.next());
}

return trim;

}

我认为如果输入空白,此条件将返回false.这将继续迭代,并且只能手动退出.

我也试过了

if (t.hasNext()) {
trim.add(t.next());
}

else {
t.close();
}

这将迭代一次,然后返回ArrayList,但我需要能够输入更多.将If或While条件更改为hasNextLine()会产生相同的结果,在这里我使用hasNext(),因为汽车装饰级别具有特定的格式预期.我不明白为什么在没有提供输入的情况下,hasNext()不会返回FALSE.

推荐答案

谢谢!我理解这样做的原因,但我想我的问题的根源是,如果hasNext()没有检测到没有输入,它将如何在我的循环中运行.

它...不会.

想想看.电脑怎么能区分一个正在考虑打字的用户和一个已经完成的用户的区别呢?打开网络摄像头,做一些人工智能分析,看看用户looks是否觉得自己已经打字完成了?

System.in,is not the keyboard.如果你从命令行启动一个设置为从键盘读取的Java应用程序,那么它是JVM进程的标准输入,至少是by default.它不必是:

java -jar myapp.jar </some/path/to/some/file.txt

现在System.in人从该文件中读取.在这一过程中,无法通过键盘进行阅读.

java -jar myapp.jar </dev/barcodeScanner1

现在,假设你扫描条形码的任何时候,Java应用程序都会收到它,就像你输入了条形码的号码,然后按下‘Enter’1.

这取决于‘这一输入的来源’到‘结束’.当您到达文件的末尾时,文件结束.

A keyboard cannot possibly 'end'-因此,100 cannot possibly return 101.

空格

你在 comments 中谈到了"输入空格".

那你就不懂Scanner了.你有一个很好的同伴;这可能是最被误解的事情.可以肯定的是,如果我们按照StackOverflow被淹没的问题的绝对数量来衡量的话.

Scanner和键盘有关的是nothing.

Scanner只是接受任何来源的文本输入,并将其拆分成块.块被称为"令牌",而"令牌"由"分隔符之间的所有文本"定义.分隔符又由正则表达式定义,by default所使用的正则表达式是\s+.如在中,任意数量的空格.

因此:

public static void main(String[] args) {
  Scanner s = new Scanner(System.in);
  while (true) {
    System.out.println("Token: ≥" + s.next()) + "≤");
  }
}

如果运行该命令,并在命令行中输入:hello world!,然后按Enter键并键入my name is Lajos,您将看到:

Token: ≥hello≤
Token: ≥world!≤
Token: ≥my≤
Token: ≥name≤
Token: ≥is≤
Token: ≥Lajos≤

关于 scanner 的事情:它是not possible注册或以其他方式获得珠子,任何属于‘分隔符’的内容是什么.你不能问 scanner :有多少空格?

当你遇到空格时,你也不能问:请停止.不,空格只是将一个令牌与下一个令牌分开.对于 scanner 来说,按Enter键与按空格键和then Enter键之间的距离是no difference at all.这两个字符都是‘1个或更多个空格字符’,因此可以互换,而且由于这是关于分隔符,因此无法检测到.

您可能根本不想使用 scanner .System.in本身当然可以区分它.

解决方案1

通常的策略是在提示中提到一些表示"完成"的神奇单词.例如:

static void main(String[] args) throws Exception {
  var s = new Scanner(System.in);
  System.out.println("Welcome to the fruit stand! Enter the fruit you'd like to buy, one at a time:");

  var basket = new ArrayList<String>();
  while (true) {
    System.out.print("Fruit (type 'DONE' when done): ");
    String fruit = s.next();
    if (fruit.equalsIgnoreCase("DONE")) break;
    basket.add(fruit);
  }

  System.out.println("Here's your basket: " + basket);
}

解决方案2

沟渠 scanner .或者至少,抛弃所有与之相关的方法,只使用nextLine,这会与它拥有的所有其他方法产生糟糕的交互作用--只 Select 一个(nextLine,或者除了nextLine之外的所有方法):

static void main(String[] args) throws Exception {
  var s = new Scanner(System.in);
  System.out.println("Welcome to the fruit stand! Enter the fruit you'd like to buy, one at a time:");

  var basket = new ArrayList<String>();
  while (true) {
    System.out.print("Fruit (enter when done): ");
    String fruit = s.nextLine();
    if (fruit.isEmpty()) break;
    basket.add(fruit);
  }

  System.out.println("Here's your basket: " + basket);
}

[1]在实践中,大多数条形码 scanner 的外观和行为都像键盘,并且没有这样的设备,因为它不存在于/dev中/不能被输送到这样的过程中.但是,作为一个例子,它是有效的.

Java相关问答推荐

使用log 4j2格式的Hibernate 显示SQL日志(log)

将具有多个未知字段的SON映射到Java POJO

如何使用解析器组合子解析Java数组类型签名?

Java 21虚拟线程会解决转向react 式单线程框架的主要原因吗?

强制Mockito返回null而不是emtpy list

为什么一个java函数会返回一个作为参数传递给它的对象?

如何在访问完所有文件后加入所有线程?

Java FX中的河内之塔游戏-在游戏完全解决之前什么都不会显示

第二次按下按钮后,我需要将按钮恢复到其原始状态,以便它可以再次工作

Javadoc在方法摘要中省略方法

从ActiveMQ Classic迁移到ActiveMQ Artemis需要进行哪些客户端更改?

迁移到Java 17后,日期显示不准确

如何仅使用键/ID的一部分(组合)高效地返回映射值?

如何在列表(链表)中插入一个新 node (作为prelast)

在JDK Flight Recorder中只记录单个线程

使用迭代器遍历HashMap不会因IF条件而停止

在Oracle中调用输出参数在索引处缺少IN或OUT参数的函数

Java集合:NPE,即使没有添加空值

如何使用命令行为Java应用程序生成烟雾测试用例

UuidGenerator Bean 类型不匹配?