如何打印正确的输出

时间:2018-07-19 13:06:45

标签: java

简而言之,这几乎是我需要的代码来在第四个和最后一个输入上强制转换IllegalArgumentException并打印出错误的输入[]

我最成功的尝试是使代码在[2]输出和[1、2]输出之后打印出错误的input []。

当前输出为

Sub CopyRows()
  Dim r_users_a As Range, r_acess_a As Range, r_users_b As Range, r_acess_b As Range, r_users_c As Range, r_acess_c As Range
  Dim count As Integer

  count = 0

  Set r_users_a = Range("D3:D5")
  Set r_acess_a = Range("E3:E5")

  Set r_users_b = Range("H3:H5")
  Set r_acess_b = Range("I3:I5")

  Set r_users_c = Range("P3:P5")
  Set r_acess_c = Range("Q3:Q5")

  For Each cell In r_users_a
    For Each cellB In r_users_b
        If cell.Value = cellB.Value Then
            Cells(r_users_c.Row + count, r_users_c.Column).Value = cell.Value
            Cells(r_users_c.Row + count, r_users_c.Column + 1).Value = Cells(cellB.Row, cellB.Column + 1).Value + Cells(cell.Row, cell.Column + 1).Value
            count = count + 1
        End If
    Next cellB
Next cell

End Sub

但我需要成为现实

[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[]

3 个答案:

答案 0 :(得分:1)

我个人会这样做:

第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数组。

您的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;

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.

答案 1 :(得分:0)

只需将.useDelimiter(" *, *")更改为.useDelimiter(",");

答案 2 :(得分:0)

它需要比您使用过的正则表达式。

这是我的方法

1)我将使用Pattern编译正则表达式(Scanner.useDelimiter内部使用已编译的Pattren)

^\\s*(\\d+(\\s*,\\s*\\d+)*)?\\s*$

2)我将检查字符串中的正则表达式是否匹配。

3)如果匹配项检查空字符串,则返回空数组。

4)如果不通过逗号分隔来分割字符串并将元素放置在int数组中(请不要忘记修剪分割的字符串)

public static Pattern ARRAY_PATTREN = Pattern
        .compile("^\\s*(\\d+(\\s*,\\s*\\d+)*)?\\s*$");
public static int[] getArray(String str) {

    int[] emptyArray = {};

    Matcher match = ARRAY_PATTREN.matcher(str);

    if (match.matches()) {
        if (str.length() > 0) {
            String[] arr = str.split(",");
            int[] intarray = new int[arr.length];
            for (int i = 0; i < arr.length; i++) {
                intarray[i] = Integer.parseInt(arr[i].trim());
            }
            return intarray;
        }

    } else {
        System.out.print("empty array ");
    }

    return emptyArray;

}