如何在 Java 中使用分隔符将字符串拆分成 ArrayList

JavaBeginner
立即练习

介绍

在 Java 编程中,操作字符串和使用像 ArrayList 这样的集合是必备的技能。本教程将指导你使用 Java 中的分隔符将字符串拆分成 ArrayList 的过程。通过完成这个实验(Lab),你将理解如何将文本数据分解成可管理的部分,并将它们存储在一个灵活的集合中,从而使你能够处理 Java 应用程序中的各种数据处理任务。

理解 Java 中的字符串和 ArrayList

在深入研究字符串拆分之前,让我们先了解一下在这个实验(Lab)中将要使用的两个关键组件。

Java 中的字符串

Java 中的字符串(String)是由字符组成的序列。它是 Java 编程中最常用的类之一。字符串是不可变的(immutable),这意味着一旦创建,它们的值就不能被更改。

例如:

String greeting = "Hello, World!";

Java 中的 ArrayList

ArrayList 是 Java 中可调整大小的数组实现。与具有固定大小的常规数组不同,ArrayList 可以动态地增长或缩小。它们是 Java 集合框架的一部分,并提供了各种用于操作存储元素的 方法。

要使用 ArrayList,我们需要从 java.util 包中导入它:

import java.util.ArrayList;

创建 ArrayList:

ArrayList<String> fruits = new ArrayList<>();
fruits.add("Apple");
fruits.add("Banana");

现在,让我们创建一个新的 Java 文件来开始使用这些概念。请按照以下步骤操作:

  1. 在你的 LabEx 环境中打开 WebIDE
  2. 导航到项目目录(它应该默认打开)
  3. 通过单击编辑器中的“新建文件”图标,创建一个名为 StringSplitDemo.java 的新文件
  4. 添加以下基本代码以创建一个简单的 Java 类:
public class StringSplitDemo {
    public static void main(String[] args) {
        // 我们将在这里添加我们的代码
        System.out.println("String Split Demo");
    }
}
  1. 按 Ctrl+S 保存文件
  2. 在 IDE 中打开终端(如果尚未打开),并编译 Java 文件:
javac StringSplitDemo.java
  1. 运行程序:
java StringSplitDemo

你应该看到输出:

String Split Demo

这确认了你的基本 Java 设置工作正常。在下一步中,我们将学习如何使用 split() 方法拆分字符串。

使用 split() 方法拆分字符串

Java 在 String 类中提供了一个名为 split() 的内置方法,它允许我们基于分隔符将字符串分成几部分。该方法返回一个字符串数组,其中包含由分隔符分隔的子字符串。

split() 方法

split() 方法将一个正则表达式(regular expression)作为参数,并返回一个子字符串数组:

String[] split(String regex)

让我们修改我们的 StringSplitDemo.java 文件,以包含拆分字符串的代码。在编辑器中打开该文件,并按如下方式更新它:

public class StringSplitDemo {
    public static void main(String[] args) {
        // 创建一个用逗号分隔值的字符串
        String csvData = "apple,banana,orange,grape,mango";
        System.out.println("Original string: " + csvData);

        // 使用逗号作为分隔符拆分字符串
        String[] fruits = csvData.split(",");

        // 打印结果数组
        System.out.println("\nAfter splitting:");
        System.out.println("Number of elements: " + fruits.length);

        // 显示数组的每个元素
        for (int i = 0; i < fruits.length; i++) {
            System.out.println("Element " + i + ": " + fruits[i]);
        }
    }
}

保存文件并运行程序:

javac StringSplitDemo.java
java StringSplitDemo

你应该看到类似于以下的输出:

Original string: apple,banana,orange,grape,mango

After splitting:
Number of elements: 5
Element 0: apple
Element 1: banana
Element 2: orange
Element 3: grape
Element 4: mango

这演示了 split() 方法如何在每个逗号处分割原始字符串,并将每个子字符串放入一个数组中。数组 fruits 现在包含五个元素,每个元素代表我们原始的逗号分隔字符串中的一个水果名称。

在下一步中,我们将把这个数组转换为 ArrayList,以便在操作数据时获得更大的灵活性。

将拆分后的字符串转换为 ArrayList

现在我们已经将字符串拆分成了数组,让我们将其转换为 ArrayList。ArrayList 比数组提供了更多的灵活性,包括动态调整大小以及用于添加、删除和操作元素的便捷方法。

将数组转换为 ArrayList

在 Java 中,有几种将数组转换为 ArrayList 的方法:

  1. 使用 Arrays.asList() 和 ArrayList 构造函数
  2. 使用循环逐个添加每个元素
  3. 使用 Java 8 Stream API

让我们更新我们的 StringSplitDemo.java 文件,以包含转换为 ArrayList 的代码。我们需要从 java.util 包中导入必要的类:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class StringSplitDemo {
    public static void main(String[] args) {
        // 创建一个用逗号分隔值的字符串
        String csvData = "apple,banana,orange,grape,mango";
        System.out.println("Original string: " + csvData);

        // 使用逗号作为分隔符拆分字符串
        String[] fruits = csvData.split(",");

        // 打印结果数组
        System.out.println("\nAfter splitting into array:");
        System.out.println("Number of elements: " + fruits.length);

        // 显示数组的每个元素
        for (int i = 0; i < fruits.length; i++) {
            System.out.println("Array Element " + i + ": " + fruits[i]);
        }

        // 方法 1:使用 Arrays.asList() 和 ArrayList 构造函数转换为 ArrayList
        ArrayList<String> fruitList1 = new ArrayList<>(Arrays.asList(fruits));

        // 方法 2:使用循环转换为 ArrayList
        ArrayList<String> fruitList2 = new ArrayList<>();
        for (String fruit : fruits) {
            fruitList2.add(fruit);
        }

        // 显示使用方法 1 创建的 ArrayList
        System.out.println("\nAfter converting to ArrayList (Method 1):");
        System.out.println("Number of elements: " + fruitList1.size());

        for (int i = 0; i < fruitList1.size(); i++) {
            System.out.println("ArrayList Element " + i + ": " + fruitList1.get(i));
        }

        // 演示向 ArrayList 添加新元素
        fruitList1.add("pineapple");
        System.out.println("\nAfter adding a new element to ArrayList:");
        System.out.println("Number of elements: " + fruitList1.size());
        System.out.println("New element: " + fruitList1.get(fruitList1.size() - 1));
    }
}

保存文件并运行程序:

javac StringSplitDemo.java
java StringSplitDemo

你应该看到类似于以下的输出:

Original string: apple,banana,orange,grape,mango

After splitting into array:
Number of elements: 5
Array Element 0: apple
Array Element 1: banana
Array Element 2: orange
Array Element 3: grape
Array Element 4: mango

After converting to ArrayList (Method 1):
Number of elements: 5
ArrayList Element 0: apple
ArrayList Element 1: banana
ArrayList Element 2: orange
ArrayList Element 3: grape
ArrayList Element 4: mango

After adding a new element to ArrayList:
Number of elements: 6
New element: pineapple

这个例子演示了如何将字符串数组转换为 ArrayList,并展示了使用 ArrayList 的一个优点:能够轻松地向集合中添加新元素。

请注意数组和 ArrayList 之间的区别:

  • 数组具有固定大小,而 ArrayList 可以动态增长
  • ArrayList 提供了诸如 add()remove()get() 之类的方法来操作元素
  • ArrayList 只能存储对象,不能存储基本类型(尽管 Java 使用自动装箱自动处理转换)

在下一步中,我们将探索用于拆分字符串的不同分隔符。

使用不同的分隔符

在之前的步骤中,我们使用逗号作为分隔符来拆分字符串。然而,split() 方法接受任何正则表达式(regular expression)作为分隔符,这使我们能够基于各种模式拆分字符串。

让我们创建一个新的 Java 文件来试验不同的分隔符。创建一个名为 DelimiterDemo.java 的文件,内容如下:

import java.util.ArrayList;
import java.util.Arrays;

public class DelimiterDemo {
    public static void main(String[] args) {
        // 1. 按单个字符拆分
        String commaString = "red,green,blue,yellow";
        ArrayList<String> colors = new ArrayList<>(Arrays.asList(commaString.split(",")));

        System.out.println("1. 按逗号拆分:");
        for (String color : colors) {
            System.out.println("  " + color);
        }

        // 2. 按空格拆分
        String spaceString = "Java Python C++ JavaScript Ruby";
        ArrayList<String> languages = new ArrayList<>(Arrays.asList(spaceString.split(" ")));

        System.out.println("\n2. 按空格拆分:");
        for (String language : languages) {
            System.out.println("  " + language);
        }

        // 3. 按多个字符拆分
        String pipeColonString = "name|John:age|30:city|New York";
        ArrayList<String> personData = new ArrayList<>(Arrays.asList(pipeColonString.split("[|:]")));

        System.out.println("\n3. 按多个字符 (| 或 :):");
        for (String data : personData) {
            System.out.println("  " + data);
        }

        // 4. 按数字拆分
        String digitsString = "apple123banana456cherry";
        ArrayList<String> fruits = new ArrayList<>(Arrays.asList(digitsString.split("\\d+")));

        System.out.println("\n4. 按数字拆分:");
        for (String fruit : fruits) {
            System.out.println("  " + fruit);
        }

        // 5. 限制拆分次数
        String limitString = "one-two-three-four-five";
        ArrayList<String> limitedParts = new ArrayList<>(Arrays.asList(limitString.split("-", 3)));

        System.out.println("\n5. 限制拆分次数 (limit=3):");
        for (String part : limitedParts) {
            System.out.println("  " + part);
        }
    }
}

保存文件并运行程序:

javac DelimiterDemo.java
java DelimiterDemo

你应该看到类似于以下的输出:

1. Splitting by comma:
  red
  green
  blue
  yellow

2. Splitting by space:
  Java
  Python
  C++
  JavaScript
  Ruby

3. Splitting by multiple characters (| or :):
  name
  John
  age
  30
  city
  New York

4. Splitting by digits:
  apple
  banana
  cherry

5. Limiting the number of splits (limit=3):
  one
  two
  three-four-five

理解不同的分隔符类型

  1. 单个字符分隔符:最简单的形式,如逗号或空格。

    string.split(",")
    
  2. 字符类分隔符:按集合中的任何字符拆分。

    string.split("[|:]")  // 按 '|' 或 ':' 拆分
    
  3. 正则表达式分隔符:用于更复杂的模式。

    string.split("\\d+")  // 按一个或多个数字拆分
    
  4. 限制拆分:第二个参数限制拆分的次数。

    string.split("-", 3)  // 最多 3 部分 (2 次拆分)
    

正则表达式中的特殊字符

当使用正则表达式作为分隔符时,某些字符具有特殊含义,必须使用反斜杠 (\) 进行转义。由于反斜杠本身需要在 Java 字符串中转义,因此最终会得到双反斜杠 (\\)。

一些常见的特殊字符:

  • \d - 匹配任何数字(在 Java 中,写为 \\d
  • \s - 匹配任何空白字符(在 Java 中,写为 \\s
  • . - 匹配任何字符(在 Java 中,写为 \\.)
  • +*? - 量词(在 Java 中,写为 \\+\\*\\?

这些示例演示了 split() 方法在处理 Java 应用程序中各种字符串格式和需求方面的多功能性。

总结

在这个实验中,你已经学习了如何使用 Java 中的分隔符将字符串拆分成 ArrayList。你获得了以下方面的实践经验:

  • 理解并使用 Java 中的字符串(String)和 ArrayList
  • 使用 split() 方法基于分隔符分割字符串
  • 将字符串数组转换为 ArrayList,以便更灵活地操作数据
  • 使用不同类型的分隔符,包括单个字符、字符类和正则表达式
  • 使用 limit 参数控制拆分过程

这些字符串操作技能是 Java 编程的基础,并将帮助你处理各种情况,包括从文件中解析数据、处理用户输入以及处理 CSV 或 JSON 等结构化文本格式。

通过结合正则表达式的强大功能和 Java 集合(如 ArrayList),你可以高效地处理和转换字符串数据,以满足你的应用程序的需求。