比如说我以个List集合中装了10W条记录,现在我要判断是否有重复项。就遇到了效率问题.
我的做法是两个For循环,然后取一条对比10W条。相当于10W*10W的比较次数
现在就是想问有没有别的跟好的解决办法?
我的做法是两个For循环,然后取一条对比10W条。相当于10W*10W的比较次数
现在就是想问有没有别的跟好的解决办法?
解决方案 »
- Help g711用java写的编解码例子
- java中如何将Object类型转换为int类型
- printwriter 追加文本问题
- 如何通过connection判断数据库类型?在线等待,立即给分!
- java调用存储过程
- JAVA音乐播放器YOYOPlayer1.1发布
- 请教如何调节jvm缓存大小?
- 在MSSQL2000中建一个表存储文章题目和内容,字段名为name varchar(250),content text
- eclipse如何编译成EXE文件
- 求教:用java+access做个商场销售系统,请问应如何准备?送100分
- 新手问个问题啊,郁闷到了 Iterator it=list.iterator();
- Integer[]... arr 没有见过这种写法,是什么意思,各位给个说法把
不存在则加入Set。
java.util.Map map = new java.util.HashMap();
for(int i = 0; i < list.size(); i++) {
if(map.containsKey(list.get(i)))//因为map查找速度相当快。
return true;
map.put(list.get(i), list.get(i));
}
return false;
for(int i=0; i<list.size(); i++){
Object item = list.get(i);
if(!set.contains(item)){
set.add(item);
}
}完事之后 set 中放的就是不重复的对象
当然,如果你还想统计一下哪些对象的重复次数,可以用 Hashtable
List list = ...... //
Hashtable hash = new Hashtable<Object, Integer>();
Integer i1 = new Integer(1);
for(int i=0; i<list.size(); i++){
Object item = list.get(i);
if(hash.containsKey(item)){
Integer count = hash.get(item);
hash.put(item, new Integer(count+1));
}else{
hash.put(item, i1);
}
}Enumeration<Object> keys = hash.keys();
while(keys.hasMoreElements()){
Object obj = keys.nextElement();
Integer count = hash.get(obj);
System.out.println("对象" + obj + "一共出现了" + count + "次");
}
contains判断都不用 如果数据重复他会自动不加载
因为是文件中的数据所以要行号。如果有两条重复的数据行号是保存不了的我就没用MAP
问题解决了
Set set = new HashSet();
List list = new ArrayList();
while()
{
... ...
String contentStr=bfreader.readLine();
set.add(contentStr);
list.add(contentStr);
... ...
}
上面是装数据,下面才是判断.
如果SET中的集合大小不=List的集合大小
if(set.size()!=list.size())
{
String lineOne = null;
String lineTwo = null;
String [] lineValueOne = null;
String [] lineValueTwo = null;
Collections.sort(list); //排序
for (int i = 0; i < list.size(); i++)
{
if((i+1)<list.size())
{
lineOne = (String) list.get(i);//第一条
lineTwo = (String) list.get(i+1);//第二条
lineValueOne = lineOne.split(":");
lineValueTwo = lineTwo.split(":");
if(lineValueOne[0].equals(lineValueTwo[0])) //判断文件中每行的号段列是否相同
{ String error = "文件中:"+lineValueOne[0]+", 在第"+ lineValueOne[1] +"行与第"+ lineValueTwo[1] +"行重复,请修改!"; }
} }
}
还有就是,你的目的想要干什么? 比如说吧,你要是在页面上输入一个名字(在你的数据库中有十万个名字),你现在要判断你输入的这个名字是不是在这个十万条数据里有重复,那么你完全可以在sql语句中做,你where条件是name=“你输入的名字”,然后算count,如果=0的话 说明没有重复,大于0的话就有重复。所以你你要说明你的意图呀。。ps:如果你什么也不为,就是为了想知道用java代码写判断十万条数据的重复性的话,那你用双重循环或者set都可以了,虽然都不是太好的效率,小女子也就无语啦^_^
LZ是想做个像VSS一样的比较器,比较2个文件哪一行不同是不我比较倾向用map
for(int i = 0; i<list.size(); i++){
String line = (String)(list.get(i));
ArrayList<Integer> al = hash.get(line);
if(al == null){
al = new ArrayList<Integer>();
hash.put(line, al);
}
al.add(i+1); // 行数从1开始算起
}Enumeration <String> keys = hash.keys();
while(keys.hasMoreElements()){
String line = keys.nextElement();
ArrayList al = hash.get(line);
if(al.size() <= 1)
continue;
System.out.print("字符串:\r\n" + line + "\r\n曾在第");
String pre = "";
for(int i=0; i<al.size(); i++){
System.out.print(pre + i);
pre = ", ";
}
System.out.println("行出现过");
}
list.add("a");
list.add("b");
list.add("c");
list.add("c");
Set<String> hs = new HashSet<String>();
hs.addAll(list);//自动会踢重
for (String string : hs) {
System.out.println(string);
}