9一壶 2022-03-10 23:54 采纳率: 75%
浏览 117
已结题

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

  • 写回答

5条回答 默认 最新

  • Dream丶大辉 2022-03-11 09:48
    关注

    这是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之前加个空字符串的判断哈。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 3月20日
  • 已采纳回答 3月12日
  • 创建了问题 3月10日

悬赏问题

  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler