去除数组中的重复元素

方法一:使用List
优点:不必排序
缺点:性能差


public static int[] removeRepeatElementOfArr (int [] arr) {
List<Integer> list = new ArrayList<Integer>();
     for (int i = 0; i < arr.length; i++) {
          if (!list.contains(arr[i])) {
          list.add(arr[i]);
          }
     }
     int[] newArr = new int[list.size()];
     for (int i = 0; i < list.size(); i++) {
          newArr[i] = list.get(i);
     }
     return newArr;
}

方法二:使用System.arraycopy()
优点:性能好
缺点:必须保证数组是已排序的,否则内部排序会影响性能

public static int[] removeRepeatElementOfArr(int[] arr) {
     int smallIndex = 0;
     int bigIndex = 1;
     Arrays. sort(arr);
     while (bigIndex < arr.length ) {
          if (arr[smallIndex] == arr[bigIndex]) {
               bigIndex++;
          } else {
               arr[++smallIndex] = arr[bigIndex++];
          }
     }
     int[] rslt = new int[smallIndex + 1];
     System. arraycopy(arr, 0, rslt, 0, smallIndex + 1);
     return rslt;
}  


### Java 中使用 HashSet 去除数组中的重复元素 在 Java 中,`HashSet` 是一种集合类,它不允许存储重复的元素。通过将数组转换为 `HashSet`,可以自动移除其中的重复项[^1]。 以下是基于提供的示例代码实现的一个完整解决方案: #### 实现代码 ```java import java.util.Arrays; import java.util.HashSet; import java.util.Set; public class ObjectArrayDeduplication { public static void main(String[] args) { // 定义一个包含重复元素数组 Integer[] numbers = {1, 2, 2, 3, 4, 4, 5}; // 使用 HashSet 对数组进行去重操作 Set<Integer> set = new HashSet<>(Arrays.asList(numbers)); // 将去重后的 HashSet 转换回数组形式 Integer[] uniqueNumbers = set.toArray(new Integer[0]); // 输出结果 System.out.println(Arrays.toString(uniqueNumbers)); } } ``` 上述代码展示了如何利用 `HashSet` 的特性来去除数组中的重复元素。具体过程如下: - 首先定义了一个整型数组 `numbers`,该数组包含了若干重复值。 - 利用 `Arrays.asList()` 方法将数组转化为列表,并将其作为参数传递给 `HashSet` 构造函数,从而创建一个新的无重复元素的集合对象[^1]。 - 接着调用了 `toArray()` 方法把 `HashSet` 转换成原始类型的数组以便后续处理或展示。 需要注意的是,在某些情况下如果自定义对象被放入到 `HashSet` 当中,则需要确保这些对象正确实现了 `hashCode()` 和 `equals(Object obj)` 方法,因为这两个方法决定了两个实例是否被认为是相等以及它们应该存放在哈希表中的哪个位置[^2]。 #### 自定义对象去重注意事项 当尝试对由用户定义的对象组成的数组执行相同的操作时,必须注意以下几点: - 如果仅覆盖其中一个而未同步调整另一个的话可能会导致意外行为——即使逻辑上认为应该是相同的条目也可能无法识别出来并保留下来。 例如下面这个测试案例说明了这一点: ```java @Test public void test01(){ HashSet<SetModel> set=new HashSet<>(); set.add(new SetModel("aaa")); set.add(new SetModel("bbb")); CollectionUtils.printList(set); } //输出结果将是: /* SetModel(name=aaa) SetModel(name=bbb) */ ``` 这里假设 `SetModel` 类已经适当覆写了它的 `hashCode/equals` 函数使得名字字段完全匹配即视为同一实体;否则即便名称属性看起来一样但实际上还是会被当作不同的成员加入容器之中[^2]。 ### 性能考量 虽然此方式简单易懂但对于大数据量场景下可能存在性能瓶颈问题,尤其是涉及到频繁增删改查动作的时候更应慎重考虑其他替代方案比如采用 LinkedHashSet 来保持插入顺序或者TreeSet来进行自然排序的同时完成唯一化需求等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值