Java案例如何实现数据拆分?

wen java案例 22

本文目录导读:

Java案例如何实现数据拆分?

  1. 使用 String.split() 方法(最常用)
  2. 使用 StringTokenizer 类(遗留类,但性能较好)
  3. 使用 Pattern 和 Matcher 类(正则表达式拆分)
  4. 使用第三方库 Apache Commons Lang
  5. 大数据量高性能拆分(使用流处理)
  6. 实际案例:CSV文件解析
  7. 性能对比与选择建议

在Java中实现数据拆分主要通过字符串的split()方法、StringTokenizer类、正则表达式以及第三方库(如Apache Commons Lang)来实现,以下是几种常见的数据拆分方案及代码案例:

使用 String.split() 方法(最常用)

public class SplitExample {
    public static void main(String[] args) {
        // 基础拆分:按逗号拆分
        String data1 = "apple,banana,orange,grape";
        String[] fruits = data1.split(",");
        System.out.println("按逗号拆分:");
        for (String fruit : fruits) {
            System.out.println(fruit);
        }
        // 按空格拆分
        String data2 = "Java Python C++ JavaScript";
        String[] languages = data2.split(" ");
        System.out.println("\n按空格拆分:");
        for (String lang : languages) {
            System.out.println(lang);
        }
        // 按多个分隔符拆分(使用正则表达式)
        String data3 = "a|b,c.d e;f";
        String[] items = data3.split("[|,.; ]");
        System.out.println("\n按多个分隔符拆分:");
        for (String item : items) {
            System.out.println(item);
        }
        // 限制拆分数量
        String data4 = "one,two,three,four";
        String[] limited = data4.split(",", 3);
        System.out.println("\n限制拆分数量为3:");
        System.out.println("元素0: " + limited[0]);  // one
        System.out.println("元素1: " + limited[1]);  // two
        System.out.println("元素2: " + limited[2]);  // three,four
    }
}

使用 StringTokenizer 类(遗留类,但性能较好)

import java.util.StringTokenizer;
public class StringTokenizerExample {
    public static void main(String[] args) {
        // 基本使用
        String data = "123-456-789-012";
        StringTokenizer tokenizer = new StringTokenizer(data, "-");
        System.out.println("使用StringTokenizer拆分:");
        while (tokenizer.hasMoreTokens()) {
            System.out.println(tokenizer.nextToken());
        }
        // 多分隔符
        String complexData = "a,b;c|d:e";
        StringTokenizer multiToken = new StringTokenizer(complexData, ",;|:");
        System.out.println("\n多分隔符拆分:");
        while (multiToken.hasMoreTokens()) {
            System.out.println(multiToken.nextToken());
        }
    }
}

使用 Pattern 和 Matcher 类(正则表达式拆分)

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PatternSplitExample {
    public static void main(String[] args) {
        // 复杂正则拆分
        String text = "User:123,Email:test@test.com,Phone:1234567890";
        // 提取键值对
        Pattern pattern = Pattern.compile("(\\w+):(\\w+[.,@]?\\w*)");
        Matcher matcher = pattern.matcher(text);
        System.out.println("使用正则提取键值对:");
        while (matcher.find()) {
            String key = matcher.group(1);
            String value = matcher.group(2);
            System.out.println(key + " = " + value);
        }
        // 使用Pattern.split()方法
        String data = "apple123banana456orange";
        Pattern numberPattern = Pattern.compile("\\d+");
        String[] parts = numberPattern.split(data);
        System.out.println("\n按数字拆分:");
        for (String part : parts) {
            System.out.println(part);
        }
    }
}

使用第三方库 Apache Commons Lang

// 需要引入依赖:org.apache.commons:commons-lang3
import org.apache.commons.lang3.StringUtils;
public class CommonsLangExample {
    public static void main(String[] args) {
        // 使用 StringUtils.split()
        String data = "  hello   world   java  ";
        String[] words = StringUtils.split(data);
        System.out.println("使用StringUtils.split()(忽略空白):");
        for (String word : words) {
            System.out.println("[" + word + "]");
        }
        // 按指定字符拆分
        String csvData = "a||b||c||d";
        String[] parts = StringUtils.split(csvData, "||");
        System.out.println("\n按||拆分:");
        for (String part : parts) {
            System.out.println(part);
        }
    }
}

大数据量高性能拆分(使用流处理)

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class StreamSplitExample {
    // 文件数据拆分
    public static List<String[]> splitFileData(String filePath, String delimiter) {
        try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
            return reader.lines()
                .map(line -> line.split(delimiter))
                .collect(Collectors.toList());
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }
    // 流式拆分字符串
    public static Stream<String> splitToStream(String data, String delimiter) {
        return Stream.of(data.split(delimiter));
    }
    public static void main(String[] args) {
        String data = "a,b,c,d,e,f,g,h,i,j";
        System.out.println("使用流拆分并处理:");
        List<String> result = splitToStream(data, ",")
            .filter(s -> !s.equals("c"))  // 过滤掉c
            .map(String::toUpperCase)      // 转大写
            .collect(Collectors.toList());
        System.out.println(result);  // [A, B, D, E, F, G, H, I, J]
    }
}

实际案例:CSV文件解析

public class CSVParser {
    // 解析标准CSV行(处理引号内的逗号)
    public static String[] parseCSVLine(String line) {
        List<String> fields = new ArrayList<>();
        StringBuilder currentField = new StringBuilder();
        boolean inQuotes = false;
        for (char c : line.toCharArray()) {
            if (c == '"') {
                inQuotes = !inQuotes;
            } else if (c == ',' && !inQuotes) {
                fields.add(currentField.toString().trim());
                currentField = new StringBuilder();
            } else {
                currentField.append(c);
            }
        }
        fields.add(currentField.toString().trim());
        return fields.toArray(new String[0]);
    }
    public static void main(String[] args) {
        String csvLine = "\"Smith, John\",35,\"123 Main St\",\"Engineer\"";
        String[] parts = parseCSVLine(csvLine);
        System.out.println("CSV行解析结果:");
        for (int i = 0; i < parts.length; i++) {
            System.out.println("字段" + i + ": " + parts[i]);
        }
    }
}

性能对比与选择建议

方法 适用场景 性能 特点
split() 简单拆分,日常使用 中等 返回数组,使用方便
StringTokenizer 高性能拆分 遗留类,不支持正则
Pattern/Matcher 复杂拆分 中等 灵活的正则支持
Commons Lang 复杂场景 功能全面,稳定性好
流式处理 大数据量 依赖场景 链式操作,函数式风格

选择建议:

  • 简单拆分:使用 String.split()
  • 性能要求高:使用 StringTokenizer 或 Commons Lang
  • 需要正则处理:使用 Pattern/MatcherString.split()
  • 处理大量数据:考虑使用流式处理和文件流

根据实际需求选择最合适的拆分方式即可。

抱歉,评论功能暂时关闭!