如何将String拆分为null直到Java结尾?

时间:2017-07-09 09:24:35

标签: java split

我必须对一个简单的Double数组进行字符串化,以便将其放入我的数据库中(在这种情况下,这是我找到的最佳方式)

我正在使用StringUtils.join()进行字符串化,但是我遇到了拆分问题,因为我的数组末尾有很多空值(这是预期的)。

以下是一些代码示例:

final String NEEDLE = "_";
Double[] dblArray = new Double[]{2.0, 2.0, 2.0, 0.0, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null};
String joined = StringUtils.join(dblArray, NEEDLE);
String[] split = joined.split(NEEDLE); //I will then cast the string to double

Log.d("MyApp", "joined=" + joined);
Log.d("MyApp", "1 - split=" + Arrays.toString(split));
Log.d("MyApp", "2 - StringUtils.split=" + Arrays.toString(StringUtils.split(joined, NEEDLE)));
Log.d("MyApp", "3 - split+xxx=" + Arrays.toString((joined+"xxx").split(NEEDLE)));
Log.d("MyApp", "4 - StringUtils.split+xxx=" + Arrays.toString(StringUtils.split(joined+"xxx", NEEDLE)));

结果如下:

  

D:加入= 2.0_2.0_2.0_0.0 _______________________________________________________
  D:1 - 分裂= [2.0,2.0,2.0,0.0]
  D:2 - StringUtils.split = [2.0,2.0,2.0,0.0]
  D:3 - split + xxx = [2.0,2.0,2.0,0.0 ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,, xxx]   D:4 - StringUtils.split + xxx = [2.0,2.0,2.0,0.0,xxx]

预期的行为是#3,但正如您所看到的,对于我的拆分结果包含空值,我必须在字符串的末尾添加一些内容,这是非常意外的。

是否有一种干净的方法可以将它与空值分开直到结束,但最后却没有添加虚拟值?

2 个答案:

答案 0 :(得分:1)

假设Java 8:

String joined = Arrays.stream(dblArray)
    .filter(Objects::nonNull)
    .map(Double::toString)
    .collect(joining(","))

修改

如果不使用Java 8,Guava Joiner也可以这样做。

编辑2 (在Java 8之前,不使用第三方库):

StringBuilder buffer = new StringBuilder();

for (Double d : dblArray) {
    if (Objects.nonNull(d)) {
        buffer.append(d + ",");
    }
}

String joined = buffer.substring(0, buffer.length() - 1);

答案 1 :(得分:1)

您正在致电split(NEEDLE)

  

此方法就像通过使用给定表达式和limit参数为零调用双参数split方法一样工作。 结尾的空字符串因此不包含在结果数组中。

您应该致电split(NEEDLE, -1)

  

limit参数控制模式的应用次数,因此会影响结果数组的长度。如果限制n大于零,那么模式将最多应用n - 1次,数组的长度将不大于n,并且数组的最后一个条目将包含除最后一个匹配分隔符之外的所有输入。 如果n是非正数,那么模式将被应用尽可能多次,并且数组可以具有任何长度。如果n为零,则模式将被应用尽可能多的数组,数组可以有任何长度,尾随空字符串将被丢弃。