【问题标题】:String.split not working as intendedString.split 未按预期工作
【发布时间】:2013-08-15 16:44:52
【问题描述】:

这简直把我逼疯了!我已经做了一些错误测试,我现在真的不知道如何进行。

我正在从文本文件中读取数据,使用 String.split(",") 方法拆分行(我使用的是逗号),然后对数据进行处理。我遇到了麻烦...我收到了 ArrayIndexOutOfBoundsException。

这是我文件的前两行:

1,,1,Male Slave,,1,1,
2,yes,1,Bronze Cooking Pot,,,,

我的代码:

        try {       
        File file = new File("/Accounts/changy/Desktop/GreekProject/data.txt");
        Scanner sc = new Scanner(file);
        sc.nextLine(); 
        while (sc.hasNextLine()) {
            String line = sc.nextLine();
            String[] splitArray = line.split(",{1}");
            System.out.println(splitArray.length);
            System.out.println(splitArray[0] + "\t" + splitArray[1] + "\t" + splitArray[2]+ "\t" + splitArray[3]+ "\t" + splitArray[4]);
        }
    }        
    catch (NullPointerException e) {
        System.out.println("NPE!!");
    }
    catch (FileNotFoundException e) {
        System.out.println("FNFE!!");
    }
    catch (ArrayIndexOutOfBoundsException e) {
        System.out.println("AIOOBE!!")
    }

所以如果我省略 splitArray[4],代码运行得非常好。我什至尝试在行尾添加额外的逗号,但这无济于事。数组的长度是 7,所以对我来说第五个条目是空的真的没有意义......任何帮助将不胜感激。

【问题讨论】:

    标签: java arrays file-io split


    【解决方案1】:

    只有一个参数的split 方法版本会在返回给您之前将数组末尾的所有空标记字符串修剪掉,因此第二行将产生一个长度仅为 4 的数组。

    使用two-argument version of split,带有负数limit,这样它就不会从数组中删除尾随的空字符串,并且所有预期的元素都会在那里。

    String[] splitArray = line.split(",{1}", -1);
    

    引用链接的 Javadocs:

    如果 n 为非正数,则该模式将被应用多次 可能,并且数组可以有任何长度。如果 n 为零,则 模式将尽可能多地应用,数组可以有 任何长度,并且尾随的空字符串将被丢弃。

    这里,当他们引用n时,他们实际上指的是limit(第二个参数)。

    【讨论】:

    • 感谢您的回复,现在可以正常使用了!但是,我仍然有一个问题 - 当我对 splitArray 执行 array.length 时,它返回的长度是 7,即使它应该返回 4 ......这就是为什么我从不怀疑它正在修剪尾随分隔符。你知道这是为什么,还是我应该让它继续前进?
    【解决方案2】:

    String.split 默默地丢弃尾随分隔符。 (这是其众多问题之一。)IIRC,您应该使用line.split(",{1}", -1); 获得所需的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 2021-06-04
      相关资源
      最近更新 更多