JAVA8下,split出现开头为空串的问题。

问题遇到的现象和发生背景

如将字符串"A1B2C3D4E5F6G7H8",通过split(“[A-Z]”)处理后,得出的字符串数组,想将此数组转成Int类型数组,但由于存在空串导致出现NumberFormatException。搜索了一些处理方案,如split("[A-Z]",StringSplitOptions.RemoveEmptyEntries),但是我这并没有这个StringSplitOptions,所以调用不了。
想知道除了循环之外,有没有其他的方式来解决这个问题?

问题相关代码,请勿粘贴截图
String s = "A1B2C3D4E5F6G7H8";
//        System.out.println(s);
//        String[] split = s.split("\\D");
//        System.out.println(split.toString());
//        int[] ints = Arrays.stream(s.split("\\D")).mapToInt(i -> Integer.parseInt(i)).toArray();
//        String[] sarr =  s.split("\\d");
//        System.out.println(ints);
//        Arrays.stream(sarr).forEach(System.out::print);
//        String[] st = new String[]{"a","b","c","d"};
//        System.out.println();
        System.out.println(s);
        String[] sp = s.split("[A-Z]");
        Arrays.stream(sp).forEach(System.out::println);
//        System.out.println(sp.length);

        int[] intarr = new int[]{};
        for (int is = 0;is < sp.length;is++){
            intarr[is] = Integer.valueOf(sp[is]);
        }
//        Arrays.stream(sp).forEach(System.out::print);
        Arrays.stream(intarr).forEach(System.out::println);

运行结果及报错内容
A1B2C3D4E5F6G7H8

1
2
3
4
5
6
7
8
Exception in thread "main" java.lang.NumberFormatException: For input string: ""
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.valueOf(Unknown Source)
    at sevtnthForBookTest.subTest.main(subTest.java:31)

我的解答思路和尝试过的方法
我想要达到的结果

数组类型由String 转变为Int

这是String.split()的一段注释:
* When there is a positive-width match at the beginning of this
* string then an empty leading substring is included at the beginning
* of the resulting array. A zero-width match at the beginning however
* never produces such empty leading substring.
大意为:当给定字符串的开头匹配到正则的时候,一个空字符串将作为array的第一个元素。如果开头没有匹配到正则,则不会存在空字符串。
你的输入: "A1B2C3D4E5F6G7H8",开头A匹配到拆分正则,所以数组开头为空字符串,可以加个判断:
如果s的开始就匹配拆分正则,则丢弃拆分后array的第一个元素,否则正常处理就行了,不过仅适用于没有连续[A-Z]的情况。
也可以这样处理:

public static void main(String[] args) throws Exception {

        String s = "A1B2C3D4E5F6G7H8";
        s = 0 + s;
        String[] split = s.split("[A-Z]");
        int[] intarr = new int[split.length-1];

        for (int i = 1; i < split.length; i++) {
            intarr[i-1] = Integer.valueOf(split[i]);
        }
    }

当然最稳妥的还是在转Integer之前加个空字符串的判断哈。

public static void main(String[] args) {
    String s = "A1B2C3D4E5F6G7H8";
    System.out.println(s);
    String[] sp = s.split("[A-Z]");
    List<String> numsList = new ArrayList<>();
    for(String ss : sp) {
        if(!"".equals(ss)){
            numsList.add(ss);
        }
    }
    int[] intarr = new int[numsList.size()];
    for (int is = 0;is < intarr.length;is++){
        intarr[is] = Integer.valueOf(numsList.get(is));
    }
    System.out.println(Arrays.toString(intarr));
}

Integer.valueOf前面加一个判空操作,split只有去除数组尾部空字符串的参数,不能去除数组前几位的空字符串。

for (int is = 0;is < sp.length;is++){
            if (sp[is].isEmpty()){
              intarr[is]=0;
            }else {
              intarr[is] = Integer.valueOf(sp[is]);
            }
        }

过滤下空字符串

img

String s = "A1B2C3D4E5F6DDG7H8";
String[] sp = s.split("[A-Z]+");
int[] intarr= Arrays.stream(sp).filter(item -> item != null && !item.equals("")).mapToInt(Integer::valueOf).toArray();