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

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


当我使用String.split()时,我希望结果是一个将较大的字符串划分为较小的元素的数组,因此BRICK1 10,BRICK2 20和BRICK3 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);

    }


人到中年有点甜
浏览 409回答 3
3回答

慕桂英4014372

就是split那样 它使用定界符对字符串进行分割,并且即使不是空字符串(即使不是最后一个字符串),也保留字符串(即使为空)(排除空字符串)。但是在这种情况下,我建议您orderList在分割之前先检查一下您的内容,#如果它是第一个字符,则将其删除:String[] orders;if (orderList.charAt(0) == '#') {    orders = orderList.substring(1).split("#");} else {    orders = orderList.split("#");}

汪汪一只猫

因为要拆分的字符串以您选择的定界符(#)开始,所以在数组的开头会得到一个空字符串。您可以通过在拆分之前从一开始将其删除(String.substring(int)例如使用方法)来防止它。解决方案示例:String[] orders = orderList.substring(1).split("#");

忽然笑

我认为问题是由于您要在订单字符串的开头附加“#”。拆分的工作方式是,它将在每个“#”处断开订单字符串,并在订单字符串的开头立即遇到第一个“#”,因此该字段为空。根据您的要求,您可以避免在开始时添加此“#”,或者在吐出之前删除“#”,或者忽略分散数组的元素。希望这可以澄清。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java