转自:http://a455360448201209214217.iteye.com/blog/1888762
hashset是单列的数据,hashmap,hashtable都是都是双列的数据,有key和value
因为需要获取id,但首次读取id的时候只读取了前五十行(1000个id),不要重复的id值。本打算从51行开始读剩余的id,但是会和前五十行id重复,读取文件文件所有行中的id值,并删除前五十行中已经获取的id值。本以为直接删除hashset中前(1000个id),但是因为hashset中的数据时无序的,所以前五十行中的1000个id值,并不是新的set中的前一百行。
如果你需要得到一个有序的结果你就应该使用TreeMap,TreeMap中的是先加入的在前边,是有序的。
此时,需要删除Hashset中的一些数据,但是直接删除的时候,使用如下方法会报错
Exception in thread "main" java.util.ConcurrentModificationException
错误方法:
if(set.contains("123"))
Set.remove(“123”);
以上方法是不对的。
此时需要:
Iterator it = set.iterator();
while(it.hasNext()){
String id=(String)it.next();
int id1=Integer.parseInt(id);
if(id1==123){
// set.remove(id); 这种方法不对
it.remove(); //只能使用这种方法
}
}
上一步仅仅在内存中将制定的数值删除,文件中的还没有删除。所以还需要将新set中的值重新写到文件中
Iterator it1 = set.iterator();
StringBuffer buffer1=new StringBuffer();
while(it1.hasNext())
{
String id=(String) it1.next();
String newline = System.lineSeparator();
String idName=id+newline;
buffer1.append(idName);
}
FileUtils.writeStringToFile(sourcefile, buffer1.toString(), false);
//参数false表明是重新写入文件,不是以追加的方法写入文件。
其实,没必要继续将所有不重复的id读取到hashset,因为数据已经不重复了,同时,如果我要是删除数据的话,使用hashset删除,需要循环很多次才可以实现,需要遍历很多次(因为有很多的id要删除,所以需要循环好多次)(删除的id要遍历,set删除id也需要遍历)。所以这样子做不好。
Iterator it = set.iterator();
while(it.hasNext()){
String id=(String)it.next();
int id1=Integer.parseInt(id);
if(id1==123){
// set.remove(id); 这种方法不对
it.remove(); //只能使用这种方法
}
}
直接使用list删除最方便,(删除是只需要循环一次要删除的id即可)
listId.contains(str);
listId.remove(str);
直接将list读取到内存中,然后判断是否删除,这样子速度很快。