String.split()导致创建一个空字符串,如何防止这种情况?

时间:2018-07-07 19:57:46

标签: java

我有一个字符串,该字符串是refNum orderNum形式的较小字符串的串联,例如包含参考号和订单上项目数量的字符串。 BRICK1 10。较大的串联字符串是将这些较小的字符串拼凑在一起并使用井号将它们分开的数量,例如#BRICK1 10#BRICK2 20#BRICK3 30

当我使用String.split()时,我希望结果是一个数组,该数组将较大的字符串分为较小的元素,因此BRICK1 10BRICK2 20BRICK3 30但是,当我实际上尝试使用“#”作为分隔符来分割字符串时,我在空数组的开头得到了第四个字符串。

我不确定为什么会发生这种情况,如何预防呢?

我的长字符串就是用这种方法产生的

public String getAllOrders()
    {
        String orderDetails = "";

        for(BrickOrder o : orderList)
        {
            String order = "#" + o.getReferenceNumber() + " " + o.getNumberOfBricks();
            System.out.println("ORDER: " + order);
            orderDetails = orderDetails.concat(order);
        }

        return orderDetails;
    }

虽然在测试类中使用了split方法,但在这里。

@Test
    public void testFullOrderListReturnedCorrectly()
    {
        sys.createOrder(10);
        sys.createOrder(100);
        sys.createOrder(1000); //Create three orders

        String orderList = sys.getOrders(); //Return full order list
        System.out.println(orderList);

        String[] orders = orderList.split("#");
        System.out.println(orders.length);
    }

6 个答案:

答案 0 :(得分:1)

由于要拆分的字符串以您选择的定界符(#)开始,因此在数组的开头会得到一个空字符串。您可以通过在拆分之前从头开始将其删除(例如,使用方法String.substring(int))来阻止它。

示例解决方案:

String[] orders = orderList.substring(1).split("#");

答案 1 :(得分:1)

split就是这样做的。它使用定界符分割您的字符串,并保留该字符串,即使它不是最后一个字符串,即使它为空也是如此(排除空字符串) 您可以改用正则表达式和模式匹配。但是在这种情况下,建议您在分割orderList之前先检查一下#,如果它是第一个字符,则删除String[] orders; if (orderList.charAt(0) == '#') { orders = orderList.substring(1).split("#"); } else { orders = orderList.split("#"); }

@-ms-viewport {
width: device-width;
}

答案 2 :(得分:1)

我认为问题是由于您要在订单字符串的开头附加“#”。

拆分的工作方式是,它将在每个“#”处断开订单字符串,并在订单字符串的开头立即遇到第一个“#”,因此该字段为空。

根据您的要求,您可以避免在开始时添加此“#”,或者在吐出之前删除“#”,或者忽略不连续数组的元素。

希望这可以澄清。

答案 3 :(得分:0)

尝试一下(需要Java 8 +):

import java.util.Arrays;
    ...
String s = "#BRICK1 10#BRICK2 20#BRICK3 30";
String[] tokens = Arrays.stream(s.split("#")).filter(t -> !t.isEmpty()).toArray(String[]::new);

答案 4 :(得分:0)

  

如何预防?

通过在要拆分的部分之间放置分隔符。

想象一下,您想将一根棍子分成两部分。

您如何做?施加武力在哪里?

Option one:  ---V---

Option two: V---V--- (looks familiar?)

很明显,前者会给你两根棍子,而后者一开始会给你一根空棍子。它只是在现实世界中不存在,而Java中恰好存在一个空字符串。

请查看String#split文档,其中的内容完全是这样:

  

将此字符串在给定的正则表达式的匹配处左右匹配。

答案 5 :(得分:0)

使用正则表达式安全地(例如,如果存在的话)删除所有前导#字符,然后拆分:

String[] ordersPairs = orderList.replaceAll("^#*", "").split("#+");

通过在"#+"上拆分,空订单也将被忽略/丢弃。