java - 如何打印出正确的输出

标签 java

简单来说,这几乎就是我需要的代码,用于在第四个和最后一个输入上转换 IllegalArgumentException 并打印出 Bad input[]

我最成功的尝试是让代码在 [2] 输出和 [1, 2] 输出之后打印出 Bad input[]。

当前输出为

[6, 8, 9, 10]
[1002]
empty array []
[2]
Bad input[]
Bad input[]
[1, 2]

但我需要它

[6, 8, 9, 10]
[1002]
empty array []
Bad input[]
Bad input[]
Bad input[]
Bad input[]

下面是整个代码。

import java.util.Arrays;
import java.util.Scanner;

public class String2intArray {

    public static void main(String[] args) {
        System.out.println(Arrays.toString(str2ia("6,8 ,9 , 10")));
        System.out.println(Arrays.toString(str2ia("1002")));
        System.out.println(Arrays.toString(str2ia("")));
        System.out.println(Arrays.toString(str2ia(", 2")));
        System.out.println(Arrays.toString(str2ia("one,two")));
        System.out.println(Arrays.toString((str2ia("1,,2"))));
        System.out.println(Arrays.toString(str2ia("1 , 2 ,")));  
    }

    public static int[] str2ia(String s) {
        int arraylengt = 0;
        int arrayindex = 0;
        Scanner scan = new Scanner(s).useDelimiter(" *, *");

        if(s.length() == 0) {
            int[] emptyArray = {};
            System.out.print("empty array ");
            return emptyArray;
        }

        while (scan.hasNext()) {
            if (scan.hasNextInt()) {
                int nextInt = scan.nextInt();
                arraylengt ++;
            } else {
                // discard next token
                scan.next(); 
            }
        }

        int[] intArray = new int[arraylengt];

        Scanner scan2 = new Scanner(s).useDelimiter(" *, *");
        try {
            while (scan2.hasNext()) {
                if (scan2.hasNextInt()) {
                    intArray[arrayindex] = scan2.nextInt();
                    arrayindex++; 
                } else {
                    // discard next token
                    throw new IllegalArgumentException("Bad input");
                }    
            }
        } catch (IllegalArgumentException e) {
            System.out.print("Bad input");
            int[] emptyArray = {};
            return emptyArray;
        }

        return intArray;
    }

}

最佳答案

我个人会做这样的事情:

第 1 步:删除所有空格:

// Remove all spaces from the input:
s = s.replaceAll("\\s", "");

第 2 步:验证输入是否为空。如果是,则打印并返回。

// Is the input empty? Return an empty array
if(s.isEmpty()){
  System.out.print("empty array ");
  int[] emptyArray = {};
  return emptyArray;
}

第 3 步:验证输入是单个数字还是用逗号分隔的多个数字。如果不是,则打印并返回。

// Is the input not valid? Return a bad result
if(!s.matches("(\\d+,)*\\d+")){
  System.out.print("Bad input ");
  int[] emptyArray = {};
  return emptyArray;
}

第 4 步:现在我们确定输入是有效的。因此,我们可以用逗号 (,) 分割输入并创建整数数组。这可以使用您已有的 Scanner 来完成,尽管我个人会使用 String[] strArray = s.split(","); 然后转换此 String-数组到 int-数组。

使用您的扫描仪,它看起来像这样:

// Determine the length of the array:
int arraylength = 0;
Scanner scan = new Scanner(s).useDelimiter(",");
while(scan.hasNextInt()){
  scan.nextInt(); // Discard the integer
  arraylength++;
}

// Fill the result-array:
int[] intArray = new int[arraylength];
int index = 0;
Scanner scan2 = new Scanner(s).useDelimiter(",");
while(scan2.hasNextInt()){
  intArray[index] = scan2.nextInt();
  index++;
}
return intArray;

Try it online.

作为引用,这里是一个没有 Scanner 的可能实现:

String[] strArray = s.split(",");
int arrayLength = strArray.length;
int[] intArray = new int[arrayLength];
for(int index = 0; index < arrayLength; index++){
  // No need to try-catch the ParseException, since we already validated the String above
  intArray[index] = Integer.parseInt(strArray[index]);
}
return intArray;

Try it online.

关于java - 如何打印出正确的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51423478/

相关文章:

java - 使用 AWS S3 KMS 加密时如何确保您的文件已加密?

java - 简单的 Spring REST 服务不起作用

java - 为什么 Matcher.find() 在 Matcher.lookingAt() 之后运行时返回 false?

java - 如何在我的 CustomAdapter 上添加 OnItemClickListener

java - 具有 2 个变量的 CPLEX 项

Java Spring - 列表的查找方法注入(inject)

java - Eclipse 如何查看 Java 文件而不是类文件

java - 为什么 OkHttp post 方法发送的是 get 请求而不是 post 请求?

java - 如何从文件中读取并将其发送到 Java 中的构造函数

java - 无法将 JSON 反序列化为 POJO(使用 Jackson)