判断重复数据

zspsys 2010-04-18 09:17:40
如何判断一个数组中的重复数据(考虑效率),如果有10000条数据,10万条,甚至更多
...全文
667 13 打赏 收藏 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
charles361 2010-04-23
  • 打赏
  • 举报
回复
用set吧,只要equals和hashCode相同在set中就只能存在一个
麦穗 2010-04-23
  • 打赏
  • 举报
回复
学习了~~!
zspsys 2010-04-23
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 nihaozhangchao 的回复:]
写了一个简单的计算重复记录


Java code

package com.samba;

public class Test {

/**
* @param args
*/
static String number = "ABCabcabcabc";

public static void main(String[] ar……
[/Quote]
你这样一个个儿的便利效率没了
zfq642773391 2010-04-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zfq642773391 的回复:]
将数组中数据转为HashSet中的数据,HashSet不允许重复,会过滤掉重复数据,而且速度很快,效率很高,这是因为他的实现使用散列实现,而不是线性查询
HashMap的解决方案就是用散列来实现键和值的存取。散列将键保存在某处,以便能够很快找到。而存储一组元素最快的数据结构是数组,所以用他来表示键的信息。数组并不保存键的值,而是保存键的信息,注意,这里是散列的关键。
我们通过键对象生成……
[/Quote]
不好意思,晕了 ,说HashSet的,怎么说成HashMap呢!?
不过他们的原理都差不多,因为HashSet内部是使用HashMap实现的,对HashSet的查询,实际上是对HashMap的查询
要存入HashSet的元素必须定义hashCode(),他对于HashSet中的散列实现是必须的
zliuzz 2010-04-19
  • 打赏
  • 举报
回复
学习了...
zfq642773391 2010-04-19
  • 打赏
  • 举报
回复
将数组中数据转为HashSet中的数据,HashSet不允许重复,会过滤掉重复数据,而且速度很快,效率很高,这是因为他的实现使用散列实现,而不是线性查询
HashMap的解决方案就是用散列来实现键和值的存取。散列将键保存在某处,以便能够很快找到。而存储一组元素最快的数据结构是数组,所以用他来表示键的信息。数组并不保存键的值,而是保存键的信息,注意,这里是散列的关键。
我们通过键对象生成一个数字,将其作为数组的下标,这个数就是散列码,由定义在Object中的、且可能由你的类覆盖的hashcode()方法生成。为了解决数组容量被固定的问题,不同的键可以产生相同的下标,也就是可以有冲突。因此,数组多大就不太重要了了,任何键总能在数组中找到他的位置。
于是,查询一个值的过程首先就是计算散列码,然后使用散列码查询数组,这样我们就不是线性查询数组,而是快速的跳到数组的某个位置,只对少数元素进行比较。这就是HashMap会如此快的原因。
详见http://blog.csdn.net/zfq642773391/archive/2010/04/16/5491862.aspx
luomf 2010-04-19
  • 打赏
  • 举报
回复
HashSet是可以排重,但不知道效率是不是最高的
SambaGao 2010-04-19
  • 打赏
  • 举报
回复
写了一个简单的计算重复记录


package com.samba;

public class Test {

/**
* @param args
*/
static String number = "ABCabcabcabc";

public static void main(String[] args) {
// TODO Auto-generated method stub
calc();
}

public static void calc() {
String ch = "";
for (int i = 0; i < number.length(); i++) {
if (ch.indexOf(number.charAt(i)) > -1)
continue;
int count = 0;
for (int j = i; j < number.length(); j++) {
if (number.charAt(i) == number.charAt(j)) {
count++;
}
}
ch += number.charAt(i);
System.out.println(number.charAt(i) + "重复的数:" + count);
}
}

}



A重复的数:1
B重复的数:1
C重复的数:1
a重复的数:3
b重复的数:3
c重复的数:3
hepeng_8 2010-04-19
  • 打赏
  • 举报
回复
用HashSet就可以了
int[] array = new int[10000];
array[0] = 1;
// 填充数据

Set set = new HashSet();
for(int i = 0; i < array.length; ++i)
{
if(set.contains(array[i]))
System.out.println(i + "重复了");
else
set.add(array[i]);
}
hardycheng 2010-04-19
  • 打赏
  • 举报
回复
用set即可实现,set可以自动去重
baoyu6446 2010-04-18
  • 打赏
  • 举报
回复
将数组中数据转为HashSet中的数据,这样就能自动把重复数据过滤掉了,然后再用for each转回数组,如果不是很清楚给我留言,我具体解释
weberwong 2010-04-18
  • 打赏
  • 举报
回复
用HashSet就可以了
int[] array = new int[10000];
array[0] = 1;
// 填充数据

Set set = new HashSet();
for(int i = 0; i < array.length; ++i)
{
if(set.contains(array[i]))
System.out.println(i + "重复了");
else
set.add(array[i]);
}
xiaohuanjie 2010-04-18
  • 打赏
  • 举报
回复

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧