如何修改此代码以处理包含字符和整数的输入文本?

Posted

技术标签:

【中文标题】如何修改此代码以处理包含字符和整数的输入文本?【英文标题】:How can I modify this code to handle an input text with characters as well as integers? 【发布时间】:2019-08-25 15:58:36 【问题描述】:

我正在尝试获取一个包含字符和整数的输入 .txt 文件,并且只读取整数以便我可以执行计算。此代码在我的输入 .txt 文件仅包含由空格和逗号分隔的整数时有效,但在我添加字符时失败。

示例文件:

Student A: 90, 85, 70, 95
Student B: 65, 75, 90, 90
Student C: 80, 80, 75, 85
Student D: 100, 75, 80, 75

public class test 

    public static void ReadScore (String[] args) 
        List<Integer> listIntegers = new ArrayList<>();
        File f = new File("input2.txt"); 
            try (Scanner sc = new Scanner(f)) 
                while (sc.hasNextLine()) 
                    String line = sc.nextLine();
                    String[] tokens = line.split("\\s*,\\s*");
                    for (String token : tokens) 
                        listIntegers.add(Integer.parseInt(token));
                    
                
             catch (Exception e) 
                e.printStackTrace();
            
            finally System.out.println(listIntegers); 
        

    public static void main (String[] args) 
        test.ReadScore(args);
    


当示例 .txt 文件仅包含整数时,我会收到如下结果:

[90, 85, 70, 95, 65, 75, 90, 90, 80, 80, 75, 85, 100, 75, 80, 75]

但是,当“学生 A:”等被引入时,我不知道如何处理,我收到 IOExceptions,例如:

java.lang.NumberFormatException: For input string: "Jeff: 10"
    at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.base/java.lang.Integer.parseInt(Integer.java:652)
    at java.base/java.lang.Integer.parseInt(Integer.java:770)
    at test.ReadScore(test.java:17)
    at test.main(test.java:27)
[]

【问题讨论】:

【参考方案1】:

最简洁的方法是将输入文件转换为完整的 CSV。学生A,M1,M2..

如果您不能这样做,则必须从输入行中删除学生姓名,然后使用分隔符逗号拆分字符串。

伪代码如下所示 line = line.substring(line.indexOf(':') + 1);

希望这会有所帮助。

【讨论】:

【参考方案2】:

你得到java.lang.NumberFormatException 因为你试图从字符串中解析整数。 要仅获取数字作为输出,您需要删除除数字之外的所有额外字符串。试试这个:

String[] tokens = line.replaceAll("[^0-9,.]", "").split("\\s*,\\s*");

希望这会有所帮助。

【讨论】:

【参考方案3】:

异常很清楚,不能转换

杰夫:10

变成一个整数....

您可以使用正则表达式并仅捕获数字部分....

public static void main(String[] args)  
    String n = "Student A: 90, 85, 70, 95";

    Pattern p = Pattern.compile("\\d+");
    Matcher m = p.matcher(n);
    while(m.find())
        System.out.println(m.group());
    

这段代码将打印出来

90 85 70 95

类似:

    String n = "Student A: 90, 85, 70, 95";
    List<Integer> l = new ArrayList<>();
    Pattern p = Pattern.compile("\\d+");
    Matcher m = p.matcher(n);
    while(m.find())
        //System.out.println(m.group());
        l.add(Integer.parseInt(m.group()));
    
    System.out.println("L:" + l);

【讨论】:

以上是关于如何修改此代码以处理包含字符和整数的输入文本?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中使用输入重定向添加整数

文本框只能输入正整数(大于0的整数)代码

Bailian3729 用set实现字符串的排序和查找文本处理

Bailian3729 用set实现字符串的排序和查找文本处理

如果字符串包含整数,如何调整该字符串的文本框

JS文本框只能输入整数