关于split分割字符串,空结果不能得到的问题

本文详细介绍了Java中如何使用字符串的split方法进行数据拆分,包括不同参数设置的影响及示例代码,帮助读者理解如何正确地处理字符串。

先看源代码

/**
 * 
 * @author 赵学庆 www.java2000.net
 *
 */
class T {
  public static void main(String args[]) {
    String num[] = new String[11];
    String sLine = "101494|360103660318444|2008/06/17|周润英|1292.0|3085.76|2778.28|912.91|106.0|||";
    num = sLine.split("//|");
    int row = 1;
    for (String s : num) {
      System.out.println(row+++"="+s);
    }
  }
}

运行结果为

 1=101494

2=360103660318444

3=2008/06/17

4=周润英

5=1292.0

 6=3085.76

7=2778.28

8=912.91

9=106.0

查看API,有一个

public String[] split(String regex, int limit);

limit 参数控制应用模式的次数,从而影响结果数组的长度。

如果限制 n 大于零,那么模式至多应用 n> - 1 次,数组的长度不大于 n,并且数组的最后条目将包含除最后的匹配定界符之外的所有输入。

如果 n 非正,那么将应用模式的次数不受限制,并且数组可以为任意长度。

如果 n 为零,那么应用模式的次数不受限制,数组可以为任意长度,并且将丢弃尾部空字符串。  修改代码为

 

/**
 * 
 * @author 赵学庆 www.java2000.net
 *
 */
class T {
  public static void main(String args[]) {
    String num[] = new String[11];
    String sLine = "101494|360103660318444|2008/06/17|周润英|1292.0|3085.76|2778.28|912.91|106.0|||";
    num = sLine.split("//|",-1); // 这里使用-1作为参数
    int row = 1;
    for (String s : num) {
      System.out.println(row+++"="+s);
    }
  }
}

运行结果

1=101494

2=360103660318444

3=2008/06/17

4=周润英

5=1292.0

6=3085.76

7=2778.28

8=912.91

9=106.0

10=

11=

12=

 

结果正常

 

 

 

 

 







<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<think>好的,我现在需要解决用户的问题:在Java中使用split(" ")方法分割字符串并去除结果。用户提到了split方法处理格和字符串的情况,并且还提供了几个引用资料,我需要结合这些引用和用户之前的问题来给出合适的回答。 首先,用户之前的问题是关于Python中使用split(' ')并去除元素,现在转向Java,所以需要比较两者的同。根据引用[1]和引用[2],Java的split(" ")在处理多个格时会产生字符串,这和Python的情况类似,但处理方式可能同。特别是引用[2]提到,当有多个连续格时,split(" ")会产生x-1个字符串,所以在分割后需要过滤这些字符串。 接下来,引用[4]提到split方法的limit参数,当limit设置为0时,会自动丢弃结尾的字符串,但可能中间的字符串仍然存在。例如,如果字符串是"I am",split(" ")会得到["I", "", "am"],这时候需要手动过滤字符串。 用户的需求是去除所有结果,包括中间和结尾的。所以需要找到一种方法,在分割后过滤掉所有字符串。可能的方案包括使用循环遍历数组,或者使用Java 8的Stream API来过滤。 根据引用[1]中的示例,用户可能已经尝试过类似的方法,但需要更明确的指导。例如,在Java中,可以使用split(" +")来分割一个或多个格,但用户可能希望严格使用split(" ")并处理结果。或者,用户可能想了解同的正则表达式如何处理分割。 另外,引用[3]提到Scanner类的nextLine问题,但用户当前的问题是关于split方法的,这部分可能暂时需要考虑,但需要确认是否相关。可能用户在处理输入时有其他问题,但当前问题集中在split后的处理。 因此,解决方案可能包括两种方式:调整split的正则表达式,或者在分割后过滤字符串。例如,使用split(" +")可以自动处理多个格,但用户可能希望显式使用split(" ")并处理结果。根据用户需求,可能需要给出两种方法的比较。 同时,需要考虑到split方法的limit参数,如引用[4]所述,设置limit为0会丢弃末尾的字符串,但中间的字符串仍存在。例如,"a b ".split(" ", 0)会得到["a", "", "b"],而"a b ".split(" +", 0)会得到["a", "b"]。因此,使用正则表达式中的" +"可能更有效,但用户可能希望知道如何在使用split(" ")的情况下处理结果。 用户的具体需求是使用split(" "),所以必须处理分割后的数组中的字符串。因此,需要遍历数组并过滤掉元素。例如,使用Java 8的Stream: String[] parts = s.split(" "); List<String> list = Arrays.stream(parts).filter(str -> !str.isEmpty()).collect(Collectors.toList()); 或者使用循环: List<String> list = new ArrayList<>(); for (String part : parts) { if (!part.isEmpty()) { list.add(part); } } 此外,用户可能关心性能问题,比如在大量数据处理时哪种方法更高效。过用户的问题主要是如何实现,所以重点放在方法上。 还需要注意,用户提到“去除结果”,包括中间和结尾的字符串,因此需要确保过滤所有元素。同时,引用[1]中的示例显示首部格会产生字符串,中间多个格也会,而末尾的会被丢弃,但根据引用[4],这可能取决于limit参数。例如,当使用split(" ", 0)时,末尾的字符串会被丢弃,但中间的字符串保留。因此,用户需要明确如何处理这些情况。 总结步骤: 1. 使用split(" ")分割字符串,得到包含字符串的数组。 2. 遍历数组,过滤掉所有字符串。 3. 可以选择使用循环或Stream API来实现过滤。 4. 可能提供替代的正则表达式方法,如split(" +"),但需说明与用户要求的区别。 在回答中需要明确说明这些步骤,并提供代码示例,同时比较同的方法,如使用正则表达式优化和手动过滤的优缺点。同时,引用提供的资料中的信息,例如引用[2]中的过滤方法,引用[4]中的limit参数影响,以增强答案的可信度。</think>在Java中使用`split(" ")`分割字符串时,需特别注意**字符串的产生规则**和**过滤方法**。以下是结合引用内容和实践的处理方案: --- ### 一、字符串的产生原因 根据引用[^2]和[^4],字符串的产生与以下场景相关: 1. **首部格**:字符串开头的每个格会生成一个字符串`""` 2. **中间连续格**:每两个非元素间的连续格数为$x$时,会产生$x-1$个字符串 3. **尾部格**:默认情况下`split()`会丢弃尾部字符串(受`limit`参数影响) --- ### 二、手动过滤字符串的两种方法 #### 方法1:遍历数组过滤 直接遍历分割后的数组,跳过元素: ```java String s = " Hello Java World "; String[] parts = s.split(" "); // 分割结果: ["", "", "Hello", "", "", "Java", "", "World", "", ""] List<String> filtered = new ArrayList<>(); for (String part : parts) { if (!part.isEmpty()) { filtered.add(part); } } System.out.println(filtered); // 输出: [Hello, Java, World] ``` #### 方法2:使用Stream API(Java 8+) 通过流式处理快速过滤: ```java List<String> filtered = Arrays.stream(s.split(" ")) .filter(str -> !str.isEmpty()) .collect(Collectors.toList()); ``` --- ### 三、优化分割的正则表达式 若想**直接避免字符串**,可调整正则表达式: ```java String s = " Split without empty "; String[] parts = s.trim().split("\\s+"); // 按1个或多个分割 // 输出: [Split, without, empty] ``` - `trim()`:移除首尾格 - `\\s+`:匹配任意数量的连续白符(包括格、制表符等) --- ### 四、`split()`的`limit`参数作用 根据引用[^4],`limit`参数控制分割次数和结果数组长度: - **`split(" ", 0)`(默认)**:丢弃尾部字符串,但保留中间字符串 - **`split(" ", -1)`**:保留所有字符串(包括尾部) --- ### 五、完整代码示例 ```java public class SplitExample { public static void main(String[] args) { String input = " Java split 处理格 "; // 方法1:遍历过滤 String[] parts1 = input.split(" "); List<String> result1 = new ArrayList<>(); for (String part : parts1) { if (!part.isEmpty()) result1.add(part); } System.out.println(result1); // [Java, split, 处理格] // 方法2:正则优化 String[] parts2 = input.trim().split("\\s+"); System.out.println(Arrays.toString(parts2)); // [Java, split, 处理格] } } ``` --- ### 关键区别总结 | 方法 | 字符串处理 | 正则表达式复杂度 | 适用场景 | |--------------------|--------------------------|----------------|--------------------------| | `split(" ")` + 过滤 | 需手动处理中间字符串 | 低 | 需严格按单个分割的场景 | | `split("\\s+")` | 自动跳过所有连续格 | 高 | 快速清理规则格的场景 | ---
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值