首页 > 解决方案 > 如何打印出正确的输出

问题描述

简而言之,这几乎就是我需要代码在第四个和最后一个输入上强制转换 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;
    }

}

标签: java

解决方案


我个人会做这样的事情:

第 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你已经拥有的来完成,尽管我个人会使用 aString[] strArray = s.split(",");然后将此String-array 转换为int-array。

有了你Scanner,它看起来像这样:

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

在线尝试。

作为参考,这将是一个可能的实现,没有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;

在线尝试。


推荐阅读