java中去除数组重复元素

本文总结了Java中去除数组重复元素的方法。包括创建集合,用contains方法判断元素是否存在后放入;利用Set无序不重复特性;使用LinkedHashSet保证顺序且不重复;以及通过两套for循环自行实现去重,并给出了相应代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天这篇文章总结记录下java中去除数组重复元素。

方法一:
创建一个集合,然后遍历数组逐一放入集合,并且在放入之前用contains方法判断集合
中是否已经存在这个元素,如果不存在,则放入,最后用toArray转成数组。
代码如下:

public static Object[] arrayDeduplication(Object[] originArray) {
        List list = new ArrayList();
        for (int i = 0; i < originArray.length; i++) {
            if (!list.contains(originArray[i])) {
                list.add(originArray[i]);
            }
        }
        Object[] resultArray = list.toArray();
        return resultArray;
    }

方法二:
利用set无序不重复的特性进行去重。
代码如下:

public static Object[] arrayDeduplication(Object[] originArray) {
        Set set = new HashSet();
        for (int i = 0; i < originArray.length; i++) {
            set.add(originArray[i]);
        }
        return set.toArray();
    }

方法三:
使用LinkedHashSet,有顺序、不重复。
代码如下:

public static Object[] arrayDeduplication(Object[] originArray) {
        LinkedHashSet linkedHashSet = new LinkedHashSet();
        for (int i = 0; i < originArray.length; i++) {
            linkedHashSet.add(originArray[i]);
        }
        return linkedHashSet.toArray();
    }

方法四:
自己写,两套for循环。
代码如下:

public static Object[] arrayDeduplication(Object[] originArray) {
        int temp = 0;  //用来记录去重后的数组长度和给临时数组作为下标索引
        Object[] tempArray = new Object[originArray.length];  //临时数组
        for (int i = 0; i < originArray.length; i++) {  //遍历原始数组
            boolean isTrue = true;
            for (int j = i + 1; j < originArray.length; j++) {  //将原数组的数据逐一比较
                if (originArray[i] == originArray[j]) {  //如果发现有重复元素,改变标记状态并结束内层循环
                    isTrue = false;
                    break;
                }
            }
            if (isTrue) {
                tempArray[temp] = originArray[i];
                temp++;
            }
        }
        Object[] resultArray = new Object[temp];
        System.arraycopy(tempArray, 0, resultArray, 0, temp);
        return resultArray;
    }
<think>好的,用户的问题是在Java去除数组中的重复元素。我需要根据提供的引用内容来回答这个问题。首先,看看用户提供的引用中有哪些相关的解决方案。 引用[1]、[2]、[3]、[4]都是关于从已排序的数组中删除重复元素Java实现。这些方法通常使用双指针法,一个快指针遍历数组,慢指针记录不复的位置。这种方法时间复杂度是O(n),空间复杂度是O(1),适用于已排序的数组。 引用[5]提到了处理允许复两次的情况,但用户的问题可能只需要基本,所以暂时可以忽略这部分,除非用户有进一步的需求。 用户的问题中没有明确数组是否已排序。如果是已排序的数组,使用双指针法效率最高。但如果是未排序的数组,可能需要不同的方法,比如使用HashSet,这会增加空间复杂度到O(n),但时间复杂度也是O(n)。或者先排序数组,再用双指针法,时间复杂度O(n log n)。 根据引用内容,用户提供的例子都是针对已排序数组的,因此可能用户的问题中的数组是已排序的。但为了全面回答,我应该同时考虑两种情况:已排序和未排序的数组。 需要分步骤说明: 1. 针对已排序数组的双指针法,如引用中的例子,详细解释代码逻辑,并给出示例代码。 2. 针对未排序数组的方法,比如使用HashSet或者LinkedHashSet来保持顺序,或者先排序后处理。但要注意,HashSet会打乱顺序,如果用户需要保持原顺序,可能需要用其他方法。 此外,需要确保代码正确,比如在双指针法中如何处理边界情况,比如空数组。引用中的代码示例都处理了数组长度为0的情况,这点需要注意。 可能还需要比较不同方法的优缺点,比如时间空间复杂度,适用场景,帮助用户选择合适的方法。 另外,用户提供的引用中有多个代码示例,可能存在细微差异,需要指出它们的共同点和不同点。例如,引用[1]中的方法使用j从0开始,当元素不同时,先递增j再赋值;而引用[3]中的方法使用idx从1开始,sentinel记录当前元素。虽然实现不同,但核心思想都是双指针。 最后,根据用户的问题,生成相关问题,比如性能分析、优化方法、应用场景等,但需要调整以适应问题,例如如何处理未排序数组,如何保持元素顺序等。</think>在Java去除数组重复元素的方法根据数组是否已排序可分为两类,以下是具体实现步骤及代码示例: ### 一、已排序数组(最优方案) 使用双指针法实现$O(n)$时间复杂度和$O(1)$空间复杂度: ```java public int removeDuplicates(int[] nums) { if (nums.length == 0) return 0; int j = 0; for (int i = 0; i < nums.length; i++) { if (nums[j] != nums[i]) { nums[++j] = nums[i]; } } return j + 1; } ``` 该方法通过快慢指针遍历数组,当发现不同元素时更新慢指针位置[^1][^2][^3]。最终返回的j+1表示新数组长度,原数组前j+1位即为结果。 ### 二、未排序数组 #### 1. 使用HashSet(不保留顺序) ```java public static int[] removeDuplicates(int[] nums) { Set<Integer> set = new HashSet<>(); for (int num : nums) set.add(num); return set.stream().mapToInt(Integer::intValue).toArray(); } ``` #### 2. 使用LinkedHashSet(保留顺序) ```java public static int[] removeDuplicatesOrdered(int[] nums) { Set<Integer> set = new LinkedHashSet<>(); for (int num : nums) set.add(num); return set.stream().mapToInt(Integer::intValue).toArray(); } ``` #### 3. 先排序后处理(推荐) ```java public static int[] removeDuplicatesWithSort(int[] nums) { Arrays.sort(nums); int j = 0; for (int i = 0; i < nums.length; i++) { if (nums[j] != nums[i]) { nums[++j] = nums[i]; } } return Arrays.copyOf(nums, j + 1); } ``` ### 方法对比 | 方法 | 时间复杂度 | 空间复杂度 | 是否保持顺序 | 适用场景 | |--------------------|-------------|-----------|------------|-----------------------| | 双指针法 | $O(n)$ | $O(1)$ | ✓ | 已排序数组[^1][^3] | | HashSet | $O(n)$ | $O(n)$ | × | 快速无需顺序 | | LinkedHashSet | $O(n)$ | $O(n)$ | ✓ | 需保持原顺序 | | 先排序后处理 | $O(n\log n)$| $O(1)$ | × | 未排序数组内存敏感场景 |
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值