JAVA数组去重和JavaScript数组去重比较

本文介绍了一种JavaScript数组去重的方法,通过构建hash对象优化性能,并展示了如何对包含日期的对象数组进行排序。

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

JS的直觉方案:
对于数组去重,只要写过程序的,立刻就能得到第一个解法:

function unique(arr) {
  var ret = []

  for (var i = 0; i < arr.length; i++) {
    var item = arr[i]
    if (ret.indexOf(item) === -1) {
      ret.push(item)
    }
  }

  return ret
}

优化方案:

核心是构建了一个 hash 对象来替代 indexOf. 注意在 JavaScript 里,对象的键值只能是字符串,因此需要 var key = typeof(item) + item 来区分数值 1 和字符串 ‘1’ 等情况

function unique(arr) {
  var ret = []
  var hash = {}

  for (var i = 0; i < arr.length; i++) {
    var item = arr[i]
    var key = typeof(item) + item
    if (hash[key] !== 1) {
      ret.push(item)
      hash[key] = 1
    }
  }

  return ret
}

灵活应用:

totalIncomeList =[]; //模拟数据
        totalIncomeList.push({tranDate:'20180023',tranAmt:'1100'})
        totalIncomeList.push({tranDate:'20171122',tranAmt:'1100'})
        totalIncomeList.push({tranDate:'20190345',tranAmt:'300'})
        totalIncomeList.push({tranDate:'20171232',tranAmt:'1540'})
        totalIncomeList.push({tranDate:'20171230',tranAmt:'1540'})

        //排序算法.
        if(totalIncomeList && totalIncomeList.length>0){
            for(let i = 0 ; i<totalIncomeList.length; i++){
                for(let j = 0; j <totalIncomeList.length-i-1; j++){
                    let firtStr = totalIncomeList[j].tranDate.substring(0,4);
                    let lastStr = totalIncomeList[j+1].tranDate.substring(0,4);
                    if(firtStr < lastStr){
                        let temp = totalIncomeList[j + 1];
                        totalIncomeList[j+ 1] = totalIncomeList[j];
                        totalIncomeList[j] = temp;
                    }
                }
            }
            //去重算法
            var ret = [];
            for(let y=0;y<totalIncomeList.length;y++) {
                let item = totalIncomeList[y].tranDate.substring(0,4);;
                if (ret.indexOf(item) === -1) {
                    ret.push(item)
                    totalIncomeList[y].isHeader =true;
                }else{
                    totalIncomeList[y].isHeader =false;
                }
            }

ReactNative做的app的显示效果:
这里写图片描述

===========完美分割线=====================

赘述:JAVA中的数组去重。

  • 方式1
package com.panda;

import java.util.Arrays;

public class Test3 {

        public int removeDuplicates(int[] nums) {
            if (nums == null)
                return 0;
            if (nums.length == 1)
                return 1;
            int current = 0;
            int next = 1;
            int len = nums.length;
            while (next < len) {
                if (nums[next] == nums[current]) {
                    for (int j = next; j < len - 1; j++) {
                        nums[j] = nums[j + 1];
                    }
                    len--;
                }
                if (nums[next] != nums[current]) {
                    next++;
                    current++;
                }
            }

            return len;
        }
    public static void main(String[] args) {
        int [] rows ={3,5,3,5,1,2,7,2};
            int removeDuplicates = new Test3().removeDuplicates(rows);
            System.out.println(removeDuplicates);
    }
}
  • 方式2
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;


public class TestList {

    public static void main(String[] args) {
        /**
         *List: 可以按顺序存放你存入的数据,当你删除第 N 个元素后, N 后边的元素会逐个向前移
         *Set:是无序存放你存入的数据, 需要使用键值对
         *
         * 你可以通过使用下边的方式 去除一个 List 内重复的数据
         */
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 1, 2, 3 );
        Set set = new HashSet<Integer>(list);    
        list = new ArrayList<Integer>(set);

        System.out.println(list);

    }

}
  • 方式N …
### Java中对数组进行的方法 在Java中,有多种方式可以实现数组操作。以下是几种常见的方法及其具体实现: #### 方法一:使用`HashSet` 通过`HashSet`的数据结构特性来自动过滤掉复元素。由于`HashSet`不允许存在相同的元素,因此可以直接将数组中的数据放入其中完成。 ```java import java.util.Arrays; import java.util.HashSet; import java.util.Set; public class ArrayDeduplication { public static void main(String[] args) { Integer[] array = {1, 2, 2, 3, 4, 4, 5}; // 使用HashSet Set<Integer> set = new HashSet<>(Arrays.asList(array)); // 将Set转换回数组 Integer[] uniqueArray = set.toArray(new Integer[0]); // 打印后的数组 System.out.println(Arrays.toString(uniqueArray)); } } ``` 这种方法简单高效,适用于基本类型的数组以及实现了`hashCode()``equals()`方法的对象数组[^1]。 --- #### 方法二:基于`List`接口的`contains()`方法 可以通过创建一个空的`List`容器,在遍历原数组的过程中逐一判断当前元素是否已存在于目标列表中。如果不存在则加入,从而达到的目的。 ```java import java.util.ArrayList; import java.util.List; public class ListBasedDeduplication { public static void main(String[] args) { Integer[] array = {1, 2, 2, 3, 4, 4, 5}; List<Integer> resultList = new ArrayList<>(); for (Integer num : array) { if (!resultList.contains(num)) { resultList.add(num); } } // 转换为数组并打印结果 Integer[] uniqueArray = resultList.toArray(new Integer[0]); System.out.println(Arrays.toString(uniqueArray)); } } ``` 此方法逻辑清晰易懂,但在大数据量情况下性能可能较差,因为每次调用`contains()`都会引发线性查找操作[^2]。 --- #### 方法三:双层`for`循环手动比较 采用两层嵌套循环的方式逐一遍历整个数组,并移除发现的第一个复项之后的所有相同值。这种方式虽然直观但效率较低(O(n²)),适合小型数据集或者学习目的。 ```java public class NestedLoopDeduplication { public static void main(String[] args) { int[] array = {1, 2, 2, 3, 4, 4, 5}; int n = array.length; for(int i=0;i<n-1;i++) { for(int j=i+1;j<n;) { if(array[i]==array[j]) { // 移动后续元素向前填充位置 for(int k=j;k<n-1;k++) { array[k]=array[k+1]; } n--; // 缩短有效长度 }else{ j++; } } } // 输出最终结果 for(int i=0;i<n;i++) { System.out.print(array[i]+" "); } } } ``` 该算法的时间复杂度较高,但对于理解基础原理很有帮助[^4]。 --- #### 方法四:针对对象数组按特定字段 当面对的是包含多个属性的对象组成的数组时,可以根据某一指定键(key)来进行条件性的筛选除冗余记录。下面展示了一个例子说明如何依据`job`字段保留每种职业仅一条记录的情况: ```javascript var arr = [ {id: 1, name:'张三', job:'前端'}, {id: 2, name:'李四', job:'前端'}, {id: 3, name:'王五', job:'java'} , {id: 4, name:'赵六', job:'前端'} , {id: 5, name:'孙七', job:'java'} , {id: 6, name:'周八', job:'Gis'} ]; let seenJobs = {}; let newArr = []; arr.forEach(item => { let jobKey = item.job; if(!seenJobs.hasOwnProperty(jobKey)){ newArr.push(item); seenJobs[jobKey] = true; } }); console.log(JSON.stringify(newArr,null,' ')); ``` 这段脚本展示了JavaScript版本的操作流程,实际应用到Java环境需调整语法细节[^3]。 --- ### 性能对比分析 | 方案 | 时间复杂度 | 场景适用 | |------|------------|----------| | `HashSet`法 | 平均O(n),最坏情况接近O(n log n)| 数据规模较大且追求简洁速解决方案时优先考虑 | | `List.contains()` 法 | O(n²) | 对于小范围内的输入较为合适 | | 双For Loop | O(n²) | 教学演示或极少数特殊需求场景下可用 | 综上所述,推荐日常开发工作中尽可能选用第一种方案即借助集合类库功能简化编码过程的同时提高运行效能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值