Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java String.split未按预期工作_Java_Arrays_File Io_Split - Fatal编程技术网

Java String.split未按预期工作

Java String.split未按预期工作,java,arrays,file-io,split,Java,Arrays,File Io,Split,这简直快把我逼疯了!我已经做了一些错误测试,现在真的不知道如何继续 我从一个文本文件中读取数据,用String.split(“,”)方法拆分行(我使用逗号),然后处理数据。我有麻烦了。。。我得到了一个关于BoundsException的数组索引 这是我的文件的前两行: 1,,1,Male Slave,,1,1, 2,yes,1,Bronze Cooking Pot,,,, 我的代码: try { File file = new File("/Acc

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

我从一个文本文件中读取数据,用String.split(“,”)方法拆分行(我使用逗号),然后处理数据。我有麻烦了。。。我得到了一个关于BoundsException的数组索引

这是我的文件的前两行:

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,所以第五个条目是空的对我来说真的没有意义。。。任何帮助都将不胜感激

String.split
自动放弃尾部分隔符。(这是它的许多问题之一。)IIRC,您应该使用
line.split(“,{1},-1”)获得所需的行为

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

使用,带有负的
限制
,这样它就不会从数组中删除尾随的空字符串,所有预期的元素都会出现

String[] splitArray = line.split(",{1}", -1);
引用链接的Javadocs:

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


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

感谢您的回答,现在它可以按需要工作了!但是,我还有一个问题-当我对splitArray执行array.length时,它返回的长度是7,尽管它应该返回4。。。这就是为什么我从来没有怀疑过它在修剪拖尾分离器。你知道为什么吗,还是我应该顺其自然,继续前进?