java 字符型数组去重
时间: 2025-03-14 11:07:06 浏览: 34
### 如何对 Java 字符型数组进行去重
在 Java 中,可以通过多种方法实现字符型数组的去重操作。以下是几种常见的解决方案:
#### 方法一:使用 `Set` 数据结构
由于集合中的元素不允许重复,可以利用这一特性来完成去重。
```java
import java.util.HashSet;
import java.util.Set;
public class RemoveDuplicates {
public static char[] removeDuplicates(char[] inputArray) {
Set<Character> set = new HashSet<>();
for (char c : inputArray) {
set.add(c);
}
// 将 Set 转换回数组形式
char[] result = new char[set.size()];
int index = 0;
for (Character character : set) {
result[index++] = character;
}
return result;
}
public static void main(String[] args) {
char[] input = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
char[] output = removeDuplicates(input);
System.out.println(new String(output));
}
}
```
此方法的时间复杂度主要取决于底层数据结构的操作效率,在大多数情况下为 O(n)[^2]。
---
#### 方法二:基于排序算法
如果允许修改原数组并对其进行排序,则可以在排序后通过一次遍历移除相邻的重复项。
```java
import java.util.Arrays;
public class RemoveDuplicatesSorted {
public static char[] removeDuplicates(char[] inputArray) {
Arrays.sort(inputArray); // 首先对数组进行排序
int writeIndex = 1; // 记录写入位置
for (int readIndex = 1; readIndex < inputArray.length; readIndex++) {
if (inputArray[readIndex] != inputArray[writeIndex - 1]) {
inputArray[writeIndex] = inputArray[readIndex];
writeIndex++;
}
}
// 截取无重复部分作为新数组返回
return Arrays.copyOfRange(inputArray, 0, writeIndex);
}
public static void main(String[] args) {
char[] input = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
char[] output = removeDuplicates(input);
System.out.println(new String(output));
}
}
```
该方法的核心在于排序后的单次扫描过程,时间复杂度通常为 O(n log n),其中排序占主导地位[^1]。
---
#### 方法三:借助布尔标记数组(适用于 ASCII 或 Unicode 子集)
当输入范围有限时(例如仅限于标准 ASCII),可创建一个固定大小的布尔数组用于记录已遇到的字符。
```java
public class RemoveDuplicatesBooleanMarking {
public static char[] removeDuplicates(char[] inputArray) {
boolean[] seen = new boolean[256]; // 假设只处理标准ASCII字符
StringBuilder sb = new StringBuilder();
for (char c : inputArray) {
if (!seen[c]) {
sb.append(c);
seen[c] = true;
}
}
return sb.toString().toCharArray();
}
public static void main(String[] args) {
char[] input = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
char[] output = removeDuplicates(input);
System.out.println(new String(output));
}
}
```
这种方法的空间开销较小,适合特定场景下的优化需求[^3]。
---
#### 总结
上述三种方式各有优劣:
- **方法一**简单直观,但可能引入额外空间消耗;
- **方法二**无需额外存储资源,不过需要预排序;
- **方法三**针对特殊条件进行了针对性设计,具备高效性和低内存占用特点。
具体选用哪种方案应视实际应用场景而定。
阅读全文
相关推荐


















