String.split无法正常工作

时间:2013-08-13 21:43:55

标签: java arrays file-io split

这让我绝对疯了!我已经做了一些错误测试,我真的不知道如何继续进行。

我正在从文本文件中读取,使用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,所以对我来说第五个条目是空的没有任何意义...任何帮助都将非常感激。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

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

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

从链接的Javadocs引用:

  

如果n是非正数,那么模式将被应用多次   可能,阵列可以有任何长度。如果n为零,那么   模式将尽可能多地应用,数组可以有   任何长度,尾随空字符串都将被丢弃。

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