数组去重离子
❶ javascript数组去重不理解
arr是要去重的数组,ret是去重后得到的新数组,hash相当于一个Map,用来记录某个元素在ret中是否回已经存在了。
程序遍历答arr,以每个元素的类型+这个元素作为Map的key,如果hash中已经有这个key了,那么就不把该元素加到ret中,如果没有那就加到ret中,同时把这个新key加到hash中。
if (hash[key] !== 1)实际上就是判断当前元素是否出现过
❷ JS数组去重
用到了数组的splice(index,endlength,item)方法,删除数组中的项,里面可以有三个参数
注意 会改变原数组
返回值 删除的项组成的新数组
代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script type="text/javascript">
var arr = [{a:1,b:1,c:1,d:1,e:1},{a:1,b:1,c:1,d:2,e:2},{a:2,b:2,c:2,d:1,e:1}];
//循环开始
for(var i=0;i<arr.length-1;i++){
//遍历数组中a b c 都一样的才往下进行
if((arr[i].a == arr[i+1].a) && (arr[i].b == arr[i+1].b) && (arr[i].c == arr[i+1].c)){
//删除重复的那一个元素,改变了数组
arr.splice(i,1);
//d的值累加
arr[i].d += arr[i+1].d;
console.log(arr)
}
}
</script>
</body>
</html>
❸ 求助:数组去重问题
第一种方法(只学到数组的看):
定义一个新的数组长度和旧数组的长度一样,存储除去重复数据的旧数组的数据和0,
public static void main(String[] args) {
// 获取一个无重复元素的数组
int[] arr = new int[] { 11, 22, 22, 33, 44, 55, 44, 66, 66, 66 };
// 先确定新数组的长度
int[] newArr = new int[arr.length];
int index = 0; // 新数组存储元素索引(或者说无重复的个数)
outer: for (int i = 0; i < arr.length; i++) {
for (int j = i + 1; j < arr.length; j++) {
//当数据重复时,跳出外圈循环
if (arr[i] == arr[j]) {
continue outer;
}
}
// 后面没有与当前元素重复的值,保存这个数
newArr[index] = arr[i];
index++;
}
// 新数组中存储着无重复的值和后面一些无效的0
int[] result = new int[index];
for (int i = 0; i < index; i++) { // 遍历有效值个数
result[i] = newArr[i];
}
System.out.println(Arrays.toString(result));
}
第二中方法:
/*
* 一个一个删除,有一个删一个.
* 把数组中的一个数据和其他数据进行比较,如果有一个重复时,就直接开始创建新数组把重复的元素去除,并重新赋给旧数组
*/
public static void main(String[] args) {
int[] arr = { 1, 1, 1, 1, 5, 3, 3, 4, 8, 8, 8, 8 };
for (int i = 0; i < arr.length; i++) {
for (int j = i + 1; j < arr.length; j++) {
if (arr[i] == arr[j]) {
// return返回的数字的地址而非数组的数值(不懂的华看一下变量的 名 和所代表的数据地址的关系)
arr = aa(arr, j);
// 改变的数组中新数据顶替了覆盖数组的就数据,所以还要重新比较一次
/*
* { 1, 1, 1, 1, 5, 3, 3, 4, 8, 8, 8, 8 }; 下标 0 1 2
* 当下标为1被删除了 ,下标2的数据补上 0 2 这个新元素还没有被比较,所以要再比较一次,所以j--
*/
j--;
}
}
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
// 需要获得旧数组和重复元素的下标,然后改成新数组并返回出来新数组
public static int[] aa(int[] arr, int index) {
// 新数组,没发现一个就去除一个.所以长度-1 就行
int[] newArr = new int[arr.length - 1];
// 因为就数组的下标要去除一个,又不知道那个,所以定义一个变量自增来当新数组的下标
int c = 0;
for (int i = 0; i < arr.length; i++) {
// 判断传进来的那个重复的下标和数组中的下标相等时,下标的元素就不用重新赋给新数组了
if (index != i) {
newArr[c] = arr[i];
c++;
}
}
return newArr;
}
第三种方法;
/* 相同的一起删除,当发现相同的元素,先统计重复的个数,然后一起删掉,得到新数组赋给旧数组 */
public static void main(String[] args) {
int[] arr = { 8, 1, 1, 1, 1, 5, 3, 3, 4, 8, 8, 8, 8 };
arr = a2(arr);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
public static int[] a2(int[] arr) {
int a = 0;
for (int i = 0; i < arr.length - 1; i++) {
for (int j = i; j < arr.length - 1; j++) {
// 如果有相同的,就统计出相同元素的个数
if (arr[i] == arr[j + 1]) {
a += 1;
}
}
if (a != 0) {
// return返回的数字的地址而非数组的数值(不懂的华看一下变量的 名 和所代表的数据地址的关系)
arr = a1(arr, arr[i], a);
// 一个元素个数获得到,统计变量清零,等待回去下一个元素重复的个数
a = 0;
}
}
return arr;
}
// 删除里面重复的元素
public static int[] a1(int[] arr, int arr2, int a) {
// 因为就数组的下标要去除一个,又不知道那个,所以定义一个变量自增来当新数组的下标
int c = 1;
// 获得新数组的长度,就是旧数组减去元素重复的次数
int[] aa = new int[arr.length - a];
// 重复的元素也要保留一个
aa[0] = arr2;
for (int i = 0; i < arr.length; i++) {
// 不与重复元素相同的元素都非给新数组
if (arr2 != arr[i]) {
aa[c++] = arr[i];
}
}
return aa;
}515253
❹ 数组去重的意义
vararr=[1,1,2,2,2,3,3,4,5,1,2,3];
arr.sort();
varstr=arr.join(",");
str=str.replace(/([^,]+,)1+/g,"$1");
console.log(str);
❺ JAVA数组去重问题
我这有个笨办法供楼主参考:
把vector中元素都取出来放到一个数组中,
根据数据的实际情况,回
选择不同的答时间复杂度为log2N的排序算法进行排序,
然后新建一个链表,
结点为保存数据和频率的类,
遍历排序后的数组,
如果链表的尾结点与数组中当前元素相同,
将尾结点的频率加1,
否则append一个频率为1的结点,
希望大牛们能给出更好的解法
❻ 有序数组去重的几种算法
这个问题的意思是,如果假设一个数组中存在重复的数据项,那么就中保留重复数据项中的一个。也就是说最终输出的结果数组中不容许存在重复数据项,所以因为这里涉及到重复数据项的问题,所以立马想到了集合(Set)这个数据结构,因为它是不容序存在重复数据项的数据结构,
思路1.也就是将数组中的所有元素插入到一个Set中,利用Set的自动剔除重复数据项的功能,将导致所有重复数据项没有办法插入成功,也就是add方法
返回false,然后调用toArray方法,返回这个集合所对应的数组。那么这个数组就是一个没有重复数据项的数组,利用这个方法,通过比较结果数组和
源数组之间的大小,查看源数组中到底是否存在重复数据项。
思路2.除了利用Set这个数据结构不容序存在重复数据项的功能之外,还有一种很容易想到的方法,也就是对整个数组进行排序,然后遍历排序之后的数组,将重复数据项,清除掉。
思路1的实现:
public static int[] noDup(int[] array) {
Set<Integer> set = new
HashSet<Integer>();
for (int i :
array)
set.add(i);
Integer[]
integers = (Integer[]) set.toArray();
int[] result
= new int[integers.length];
for (int i =
0; i < integers.length; i++)
result[i] =
integers[i];
return
result;
}
思路2的实现:
使用快速排序等算法对数组进行排序,这个排序过程不在介绍。假设下面这个算法的输入是一个几经排好序的数组。
for (int i = 0; i < array.length - 1; i++) {
if (array[i]
== array[i + 1]) {
array[i] =
-1;
}
}
通过上面这段代码就能够实现把数组中所有的重复数据项只保留一个,其它的置为-1或者根据实际情况置成其它值。然后遍历数据,删除所有位-1的数据项,并且将数组中包含的记录个数不断减少即可。
❼ js数组去重:string.split(",")
基本思路,对象的属性名不能重复(注意不是属性值),重复的话覆盖。所以专得到这样属的代码:
varstr="1,2,4,5,2,4";//document.getElementById("textbox1").innerText;
vars=str.split(',');
vardic={};
for(vari=s.length;i--;){
dic[s[i]]=s[i];
}
varr=[];
for(varvindic){
r.push(dic[v]);
}
alert(r.join());//-----------1,2,4,5
❽ js中数组去重的几种方法
function clear(arr) {
// 1 如何获取数组中每一个元素出现的次数
var o = {}; // 1.1 记录数组中元素出现的次数
for (var i = 0; i < arr.length; i++) {
var item = arr[i]; // 数组中的每一个元素
// o[item] = 1;
// 1.2 判断o对象是否有当前遍历到的属性
if (o[item]) {
// 如果o[item] 存在,说明次数不为1
o[item]++;
} else {
// 如果o[item] 不存在,说明是第一次出现
o[item] = 1;
}
}
// console.log(o);
// 2 生成一个新的数组,存储不重复的元素
var newArray = [];
// 2.1 遍历对象o中的所有属性
for (var key in o) {
// 2.2 判断o对象中当前属性的值是否为 1 如果为1 说明不重复直接放到新数组中
if (o[key] === 1) {
newArray.push(key);
} else {
// o对象中当前属性 次数不为1 ,说明有重复的,如果有重复的话,只存储一次
// 判断当前的newArray数组中是否已经有该元素
if (newArray.indexOf(key) === -1) {
newArray.push(key);
}
}
}
return newArray;
}
var array = ['c', 'a', 'z', 'a', 'x', 'a'];
var newArray = clear(array);
console.log(newArray);
❾ JS数组去重的几种常见方法
js 数组去重
1
注:应该也可以适用于 object数组,但是本人没有进行验证,贴出来仅供你参考
第一种是比较常规的方法思路:1.构建一个新的数组存放结果2.for循环中每次从原数组中取出一个元素,用这个元素循环与结果数组对比3.若结果数组中没有该元素,则存到结果数组中代码如下:
Array.prototype.unique1 = function(){ var res = [this[0]]; for(var i = 1; i < this.length; i++){ var repeat = false; for(var j = 0; j < res.length; j++){ if(this[i] == res[j]){ repeat = true; break; } } if(!repeat){ res.push(this[i]); } } return res;}var arr = [1, 'a', 'a', 'b', 'd', 'e', 'e', 1, 0]alert(arr.unique1());
第二种方法比上面的方法效率要高思路:1.先将原数组进行排序2.检查原数组中的第i个元素 与 结果数组中的最后一个元素是否相同,因为已经排序,所以重复元素会在相邻位置3.如果不相同,则将该元素存入结果数组中代码如下:
Array.prototype.unique2 = function(){ this.sort(); //先排序 var res = [this[0]]; for(var i = 1; i < this.length; i++){ if(this[i] !== res[res.length - 1]){ res.push(this[i]); } } return res;}var arr = [1, 'a', 'a', 'b', 'd', 'e', 'e', 1, 0]alert(arr.unique2());
二种方法也会有一定的局限性,因为在去重前进行了排序,所以最后返回的去重结果也是排序后的。如果要求不改变数组的顺序去重,那这种方法便不可取了。第三种方法(推荐使用)思路:1.创建一个新的数组存放结果2.创建一个空对象3.for循环时,每次取出一个元素与对象进行对比,如果这个元素不重复,则把它存放到结果数组中,同时把这个元素的内容作为对象的一个属性,并赋值为1,存入到第2步建立的对象中。说明:至于如何对比,就是每次从原数组中取出一个元素,然后到对象中去访问这个属性,如果能访问到值,则说明重复。代码如下:
Array.prototype.unique3 = function(){ var res = []; var json = {}; for(var i = 0; i < this.length; i++){ if(!json[this[i]]){ res.push(this[i]); json[this[i]] = 1; } } return res;}var arr = [112,112,34,'你好',112,112,34,'你好','str','str1'];alert(arr.unique3());