现在有两个集合,一个是号码集合,另外一个是黑名单集合,现在需要把号码集合中的黑名单剔除,目前用到的方式就是双循环,但是号码集合和黑名单集合都可能有几十万的号码,双循环的话速度太慢了,各位高人有没有什么号的方式剔除黑名单?集合A:号码集合
集合B:黑名单集合
需要得到的结果:剔除集合B出现在集合A中的号码
集合B:黑名单集合
需要得到的结果:剔除集合B出现在集合A中的号码
解决方案 »
- jsp提交表单时,action不执行set方法,导致action取不到页面传来的值
- hibernate超新手问题,得到所有对象
- SSH构架做查询数据,怎么查完之后表里的数据都没了呢?
- 得到一个公司的 测试PROJECT。大家帮帮忙!从摄像头获取图像,显示到网页
- 关于default-action-ref失效的问题
- 又有问题了,请大家帮帮忙。
- 请帮帮忙!!!菜鸟求救!!(问题很简单tomcat路径问题)
- jsp+oracle+tomcate4.1连接池的有错误?
- 关于使用log4j生成的日志文件的命名问题
- 关于多线程Runnable的问题~
- 用java怎么去修改文件(.cfg)内容,想在其中添加一行内容,不知道怎么作,求代码
- javaeye怎么发带图片的博文?
e.gSet<String> a = new HashSet<String>();
a.add("1");
a.add("2");
a.add("3");
Set<String> b = new HashSet<String>();
b.add("1");
b.add("3");
a.removeAll(b);
System.out.println(a);
Map map1 = new HashMap<String, String>();
map1.put("aaaa", "aaaa");
map1.put("cccc", "cccc");
map1.put("dddd", "dddd");
Map<String, String> map2 = new HashMap<String, String>();
map2.put("aaaa", "aaaa");
map2.put("cccc2", "cccc2");
map2.put("dddd2", "dddd2");
Set entries = map2.entrySet();
Iterator iterator = entries.iterator();
//循环完黑名单集合即可
while(iterator.hasNext())
{
Entry entry =(Entry)iterator.next();
Object key = entry.getKey();
map1.remove(key);
}
如果放在list里,也是只要循环完黑名单即可(号码集合不重复可以用) //如果集合在list里
List<String> list1 = new ArrayList<String>();
list1.add("222");
list1.add("aaaaaaa");
list1.add("eee");
List<String> list2 = new ArrayList<String>();
list2.add("aaaaaaa1");
list2.add("eee1");
list2.add("222");
//循环完黑名单集合即可
for(int i=0;i<list2.size();i++)
{
list1.remove(list2.get(i));
}代码未测试,请见谅
主要通过数据库,及临时表解决较快。数据库为sql2000
具体做法:
首先:写一个存储过程过滤黑名单【写一个过滤黑名单表的删除语句。进行黑名单过滤】,包括分页提取最后的数据,我的是每页100000条。
1. 导入txt将其加入HASHSET去掉重复。
2. 数据批量读入临时表
3. 调用存储过程进行过滤,循环分页自动提取。
4. 干净数据放入集合。
5. 清除临时表。
6. 下载一个没有黑名单的文件。
实验数据:10万黑名单数据,30万txt数据。。在自己的电脑上,到第5步完成用时没超过1分钟服务器应该更快。。
临时表的方式当时也考虑过,但是如果我做一个筛号软件的话,还需要在客户机上安装sqlserver,就太繁琐了,采用了etnet的第一种方法,效率挺高