JAVA-集合-ArrayList元素去重除重

我们知道,ArrayList集合是一种有序但不唯一的集合,当我们需要去掉其中重复的元素时,我们就需要写一个除重的方法了

原理为:新建一个空的ArrayList容器,通过遍历需要除重的原容器,遍历时判断新容器中是否包含当前元素,若没有,则添加之,最后返回这个新的容器,通常需要一个ArrayList来接收。

注:如需要判断元素中的值是否相同,需要重写equals方法,因为contains本质是调用equals方法,但Object中的equals方法是比较哈希值,我们需要改写为我们想要它按我们的想法比较的方法。

代码如下:

public static ArrayList single(ArrayList al) {
		ArrayList temp =new ArrayList();   //新建一个ArrayList容器
		Iterator it = al.iterator();   //新建迭代器
		while(it.hasNext()) {   //使用迭代器遍历需要除重的容器
			Object obj=it.next();
			if (!temp.contains(obj)) {  //如果新容器中不包含当前元素
				temp.add(obj);   //添加之
			}
		}
		return temp;    //此方法返回的是一个ArrayList对象,需要用一个ArrayList对象来接收
	}

效果展示:

### Java ArrayList 的方法 在Java中,`ArrayList` 是一种常见的集合型,但它允许存储复的元素。为了 `ArrayList` 中的复项,有多种方法可供选择。 #### 方法一:使用 `HashSet` 或 `LinkedHashSet` 可以通过将 `ArrayList` 转换为 `HashSet` 来自动,因为 `Set` 接口不允许存在元素[^2]。如果需要保持原有顺序,则可以使用 `LinkedHashSet`: ```java import java.util.ArrayList; import java.util.HashSet; import java.util.LinkedHashSet; public class RemoveDuplicates { public static void main(String[] args) { ArrayList<Integer> numbers = new ArrayList<>(); numbers.add(1); numbers.add(2); numbers.add(3); numbers.add(2); numbers.add(4); System.out.println("原始列表: " + numbers); // 使用 HashSet (无序) numbers = new ArrayList<>(new HashSet<>(numbers)); // 如果需要保留原有序列,可改用 LinkedHashSet // numbers = new ArrayList<>(new LinkedHashSet<>(numbers)); System.out.println("后的列表: " + numbers); } } ``` 此方法简单高效,适用于大多数场景。 --- #### 方法二:使用 `Collections.frequency()` 和 `Iterator` 另一种方式是通过手动遍历并借助 `Collections.frequency()` 函数检测每个元素出现的频率。当发现某元素出现多次时,将其移[^1]: ```java import java.util.*; public class RemoveDuplicatesWithFrequency { public static void main(String[] args) { List<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 10, 10)); System.out.println("原始列表: " + numbers); Iterator<Integer> iterator = numbers.iterator(); while (iterator.hasNext()) { Integer number = iterator.next(); if (Collections.frequency(numbers, number) > 1) { iterator.remove(); // 移当前元素 } } System.out.println("后的列表: " + numbers); } } ``` 这种方法适合于某些特定需求下不想改变数据结构的情况。 --- #### 方法三:创建新的 `ArrayList` 并过滤复项 还可以通过构建一个新的 `ArrayList` 实现操作。对于每读取的一个旧集合中的元素,在新集合中检查是否存在;若不存在则加入其中[^3]: ```java import java.util.*; @SuppressWarnings({"rawtypes", "unchecked"}) public class CustomRemoveDuplicates { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("a1"); list.add("a2"); list.add("a1"); list.add("b2"); System.out.println("原始列表: " + list); ArrayList<String> newList = removeDuplicates(list); System.out.println("后的列表: " + newList); } private static ArrayList removeDuplicates(ArrayList oldList) { ArrayList newList = new ArrayList<>(); for (Object element : oldList) { if (!newList.contains(element)) { newList.add(element); } } return newList; } } ``` 这种方式逻辑清晰易懂,尤其适配复杂对象型的情况。 --- ### 性能对比分析 - **时间复杂度** - 利用 `HashSet/LinkedHashSet`: O(n),整体性能较好。 - 手动迭代法 (`Collections.frequency()`) :O(n²),效率较低,尤其是大数据量情况下。 - 构建新数组法:接近线性时间复杂度 O(n),具体取决于内部实现细节。 因此推荐优先考虑基于 `Set` 的解决方案以获得更优的时间表现。 --- 问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值