【问题标题】:How to read float input without knowing size in java?如何在不知道 Java 大小的情况下读取浮点输入?
【发布时间】:2021-06-02 13:00:12
【问题描述】:

示例输入:

9.1 9.0 8.9 8.8 9.4 7.9 8.6 9.8

这是我获取输入的代码。

在不知道输入数量的情况下,我不知道如何获得这种类型的输入。

import java.io.*;
import java.util.*;

/**
 * Diving_Competition
 */
public class Diving_Competition {
    public static void main(String[] args) throws IOException {
        Scanner in = new Scanner(System.in);
        ArrayList<Float> lst = new ArrayList<Float>();

        while (in.hasNextFloat()) {
            lst.add(in.nextFloat());
        }

        System.out.print(lst);

        in.close();
    }
}

这个循环无限运行。如何在不知道其大小的情况下在一行中获取输入?

我是python背景的

【问题讨论】:

  • 此循环不会“运行无限时间”。它会在hasNextFloat() 返回 false 时立即停止,如果不是在其他内容出现之前,它肯定会在输入结束时执行此操作。这里没有问题要解决。
  • 线程“主”java.lang.NumberFormatException 中的异常:java.base/jdk.internal.math.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1842) 处 java.base/jdk 处的空字符串。 internal.math.FloatingDecimal.parseFloat(FloatingDecimal.java:122) 在 java.base/java.lang.Float.parseFloat(Float.java:461) 在 Diving_Competition.main(Diving_Competition.java:15)
  • 这更能证明循环不会无限期地运行。如果那是你真正的问题,你应该问它。但是这段代码没有调用parseFloat(),也没有抛出这个异常。

标签: java arrays input java.util.scanner


【解决方案1】:

只要有数字输入,你的代码就不会退出while循环,因为满足in.hasNextFloat()的条件。

假设您在终端中输入示例:要退出循环,只需输入任何非数字值,例如 a 或输入 EOF 命令。在 Unix 中这是 Ctrl+D 而在 Windows 中是 Ctrl+Z (不确定 Windows-Command )

【讨论】:

    【解决方案2】:

    有一点没有java,但我认为这可行。我阅读了整行并将它们分开。

    import java.io.*;
    import java.util.*;
    
    /**
     * Diving_Competition
     */
    public class read {
        public static void main(String[] args) throws IOException{
            Scanner in = new Scanner(System.in);
            String string = in.nextLine();
            String[] stringLst = string.split(" ");
            ArrayList<Float> numLst = new ArrayList<Float>();
            
            for (String num : stringLst) {
                numLst.add(Float.parseFloat(num));
            }
            
            System.out.print(numLst);
        
            in.close();
        }
    }
    

    【讨论】:

    • 9.1 9.0 8.9 8.8 9.4 7.9 8.6 9.8 线程“main”中的异常 java.lang.NumberFormatException:java.base/jdk.internal.math.FloatingDecimal.readJavaFormatString 处的空字符串(FloatingDecimal.java:1842 ) 在 java.base/jdk.internal.math.FloatingDecimal.parseFloat(FloatingDecimal.java:122) 在 java.base/java.lang.Float.parseFloat(Float.java:461) 在 Diving_Competition.main(Diving_Competition.java: 15)
    • 我得到了像空字符串这样的异常
    • 那是因为这段代码比你已经​​发布的更糟糕。它假设每个令牌都是一个实数,并且只使用它来处理行浪费了Scanner。不要使用。
    • 任何人都可以更正并发送它。我是 Java Beginer 的新手
    • @CalebSadler 实用程序不会在意外情况下抛出异常。这没有争议。
    【解决方案3】:

    找出此类问题的最佳方法是通过调试器或使用控制台打印有用信息。您的程序非常好,它挂起,因为它需要输入一个输入(除非您想将输入作为程序 args 进行扫描,那么这是一个不同的问题)。

    这里我对你的程序做了一个简单的改动

    public static void main(String[] args) throws IOException {
        Scanner in = new Scanner(System.in);
        ArrayList<Float> lst = new ArrayList<Float>();
    
        while (in.hasNextFloat()) {
            float x = in.nextFloat();
            System.out.println("Number Entered: " + x);
            lst.add(x);
        }
    
        System.out.print(lst);
    
        in.close();
    }
    

    这里是控制台输出

    2.3
    Number Entered: 2.3
    re
    [2.3]
    

    注意如何结束输入,我必须输入 非浮动 字母。如果我不输入,程序将继续从控制台获取输入,一个接一个

    话虽如此,从您的问题来看,您似乎想从控制台获取 line 的浮点输入。如果是这种情况,那么您应该逐行阅读并根据“空格”字符对其进行解析。

    【讨论】:

      猜你喜欢
      • 2022-01-15
      • 1970-01-01
      • 2018-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多