【问题标题】:Split a string with empty data [duplicate]用空数据拆分字符串[重复]
【发布时间】:2019-07-07 08:26:06
【问题描述】:

我正在为我的公司在JavaAndroid 平台)上开发一个应用程序,遇到了一个我无法解决的问题。 事情是这样的:通过阅读text file,我用以下内容填充content 字符串:

String content = "";
content = buffReader.readLine(); buffReader.close();

这项工作非常好。 content 字符串正确填充了文件内容。这个字符串的每一行数据都用&字符分隔,所以我这样填充lines数组:

String[] lines; 
lines = content.split("&");

同样,这里没有错误。然后,每个字段用: 字符分隔,我再次尝试以相同的方式填充下一个字符串:

String line; String[] data;
String data1 = ""; String data2 = ""; String data3 = ""; String data4 = "";

for (int i = 0; i < lines.length; i++){
    line = lines[i];
    data = line.split(":");
    data1 = data[0];
    data2 = data[1];
    data3 = data[2];
    data4 = data[3];
}

如果文本是A:B:C:D,则代码可以正常工作。即使文本是 A:B::D 也没关系(并且 data3 变成 "" 就像我想要的那样)。但是,如果文本是A:::,则代码不起作用并关闭应用程序。在这种情况下,我可以获得data1 = data[0],但对于其他每个步骤,都会出现错误。

有谁知道怎么回事?!我错过了什么吗?非常感谢。

编辑:

如果有人能解释为什么代码可以与 A:B::D 文本一起正常工作...我的意思是!它确实有一个空文件,对吧?

【问题讨论】:

  • “不起作用” .. 你能说得更具体点吗?
  • @Stultuske,它关闭了应用程序。
  • @Pspl 更具体的错误是什么。
  • 我的猜测是你得到 IndexOutOfBoundsException 因为split 默认删除空的尾随字符串,所以对于A:::,结果数组将只包含{"A"} 而不是{"A", "", "", ""}(所以没有索引1, 2,3)。如果是这种情况,请按照Java String split removed empty values中所述使用split(":", -1)
  • 因为它会删除尾随空字符串,而不是非空元素中间的那些。例如,如果您有A:B::,那么首先它将被拆分为数组{"A", "", "B", "", ""},但是因为通常我们不需要最后一个空值(例如当我们根据行分隔符拆分文本文件时,它有一些额外的空行最后)Java 作者决定从末尾自动删除空字符串(因为 Java 8 有时甚至从前面删除 - stackoverflow.com/q/22718744)。所以它创建并返回另一个没有那个“副产品”的更小的数组。

标签: java android arrays string split


【解决方案1】:

你应该像这样使用 split 来防止删除空值

for (int i = 0; i < lines.length; i++){
    line = lines[i];
    data = line.split(":",-1);
    data1 = data[0];
    data2 = data[1];
    data3 = data[2];
    data4 = data[3];
}

如果 n 为非正数,则该模式将被应用尽可能多的次数,并且数组可以具有任意长度。

【讨论】:

    猜你喜欢
    • 2015-05-12
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 2021-03-10
    • 2010-11-03
    • 1970-01-01
    • 2013-08-19
    相关资源
    最近更新 更多