判断重复数据 如何判断一个数组中的重复数据(考虑效率),如果有10000条数据,10万条,甚至更多 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用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]);} 将数组中数据转为HashSet中的数据,这样就能自动把重复数据过滤掉了,然后再用for each转回数组,如果不是很清楚给我留言,我具体解释 将数组中数据转为HashSet中的数据,HashSet不允许重复,会过滤掉重复数据,而且速度很快,效率很高,这是因为他的实现使用散列实现,而不是线性查询 HashMap的解决方案就是用散列来实现键和值的存取。散列将键保存在某处,以便能够很快找到。而存储一组元素最快的数据结构是数组,所以用他来表示键的信息。数组并不保存键的值,而是保存键的信息,注意,这里是散列的关键。 我们通过键对象生成一个数字,将其作为数组的下标,这个数就是散列码,由定义在Object中的、且可能由你的类覆盖的hashcode()方法生成。为了解决数组容量被固定的问题,不同的键可以产生相同的下标,也就是可以有冲突。因此,数组多大就不太重要了了,任何键总能在数组中找到他的位置。 于是,查询一个值的过程首先就是计算散列码,然后使用散列码查询数组,这样我们就不是线性查询数组,而是快速的跳到数组的某个位置,只对少数元素进行比较。这就是HashMap会如此快的原因。 详见http://blog.csdn.net/zfq642773391/archive/2010/04/16/5491862.aspx 不好意思,晕了 ,说HashSet的,怎么说成HashMap呢!?不过他们的原理都差不多,因为HashSet内部是使用HashMap实现的,对HashSet的查询,实际上是对HashMap的查询要存入HashSet的元素必须定义hashCode(),他对于HashSet中的散列实现是必须的 用set即可实现,set可以自动去重 用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]);} 写了一个简单的计算重复记录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重复的数:1B重复的数:1C重复的数:1a重复的数:3b重复的数:3c重复的数:3 HashSet是可以排重,但不知道效率是不是最高的 用set吧,只要equals和hashCode相同在set中就只能存在一个 请问如何使一个组件跟着鼠标箭头走啊? awt更改标题栏小咖啡图标 JAVA运行异常问题 问一菜鸟问题有关frame中加载图片。。。。 为什么在APPLET中加入JBUTTON,运行后,需要点击该按钮所在位置,按钮才会显示? java初学者关于arraylist的问题 装完SDK后 为什么要设置执行路径??? 哪位好心的高手,救救我吧! Class.forname(driver)有error360错误:java.lang.classnotfoundexception,急救! classpath的几个问题。 有关java登陆框的问题 JAVA 下载 URL地址 中文 下载失败
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]);
}
HashMap的解决方案就是用散列来实现键和值的存取。散列将键保存在某处,以便能够很快找到。而存储一组元素最快的数据结构是数组,所以用他来表示键的信息。数组并不保存键的值,而是保存键的信息,注意,这里是散列的关键。
我们通过键对象生成一个数字,将其作为数组的下标,这个数就是散列码,由定义在Object中的、且可能由你的类覆盖的hashcode()方法生成。为了解决数组容量被固定的问题,不同的键可以产生相同的下标,也就是可以有冲突。因此,数组多大就不太重要了了,任何键总能在数组中找到他的位置。
于是,查询一个值的过程首先就是计算散列码,然后使用散列码查询数组,这样我们就不是线性查询数组,而是快速的跳到数组的某个位置,只对少数元素进行比较。这就是HashMap会如此快的原因。
详见http://blog.csdn.net/zfq642773391/archive/2010/04/16/5491862.aspx
不过他们的原理都差不多,因为HashSet内部是使用HashMap实现的,对HashSet的查询,实际上是对HashMap的查询
要存入HashSet的元素必须定义hashCode(),他对于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]);
}
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