有一个需求,需要实现对字符串的计数,然后存入数据库,不过字符串的种类有点多,0到百万级,请问如何实现?如果用默认大小的hashmap的话,不断的重构效率太低了,有什么好的解决办法?
解决方案 »
- 为什么java的子类中必须调用父类的构造方法。
- Vector不会为static 分配空间,是不是这样吧?
- swing 自定义控件
- 程序中遇到了String操作的问题,请大家帮忙
- 为什么线程不结束
- 我有一个JFrame,下面有很多JPanel,各个panel都有几个JTextField,JTextArea,我想让所有的JTextField和JTextArea都不可编辑,怎么办?
- 大物理学家霍金 受迫害解密
- 关于错误处理的方法,请大家讨论,高分给!
- 怎么能把cmd下输入的汉字输入数据库的时候不会乱码?给分多多
- JAVASERVERLET是什么?实现SERVERLET编程需要那些软件?
- java正则表达式
- JAVA反射问题,关于反射后找寻方法的问题
1. 直接访问数据库,有则加1,没有则为1
2. 使用HashMap作为缓存(如存一万条,满了则把使用频率最低的移除并更新数据库)+数据库查询
3. 使用文件对字符串排序,再统计存入数据库
4. 综合上面的方法一起使用.
1.可以采用缓存技术实现
2.自定义一个类继承HashMap,进行一些处理,适合自己使用
需求是这样的,一个文件,存储了很多个字符串,字符串的范围是知道的(0 - 100万都有可能出现0到若干次),现在需要对每个字符串出现的次数进行计数,然后存入导数据库中。考虑过用两个arraylist,一个放字符串,一个放出现的次数。
如果只是想计数的话,使用bitSet试试
举个例子,你现在统计的是《三国演义》。每次统计一回(我上面说的8K)统计这一回出现的字及其次数,假设第一回只有这样两行。
宴桃园豪杰三结义 斩黄巾英雄首立功
话说天下大势,分久必合,合久必分。那么这个map就是
宴1 桃1 园1 豪1 杰1 三1 结1 义1 斩1 黄1 巾1 英1 雄1 首1 立1 功1 话1 说 1 天1 下1 大1 势1 分 2 久2 必2 合2然后把这个map更新到数据库。每个字都先判断数据库是否存在,不存在就是insert存在就是update n=n+x第二回合
张1 翼1 德1 怒1 鞭1 督1 邮1 何1 国1 舅1 谋1 诛1 宦1 竖1
把这个全新map(区别于上一回合的map)更新到数据库。一样是区分insert/update一次性更新的话,map的大小可能很大。这样做的好处是,减少了Map总的大小,通常相近段落,出现的字词重复较多。不过,如果内存足够大的话,应该不是问题,因为中文常用字的个数顶多5000个。而每个字都更新数据库的话,开销也太大。
如果存入list的时候做一些处理,采用二分搜索得到下标,是否可行?如果在数据库查询的实现不也是采用的二分搜索的思想么?
int i = indexFor(hash, table.length);这样就得到了所在位置,然后HashMap再遍历这个位置上的链表判断。这个与size也没有关系,与factor有关(当然,如果你的key元素的hashCode写得很烂,导致大量key计算的位置都相同则会有关)
这个结论是基于这样的前提:哈希函数以合适的方式散布map元素于map的buckets中public V get(Object key) {
if (key == null)
return getForNullKey();
int hash = hash(key.hashCode());
for (Entry<K,V> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
}
return null;
}这个问题就可以归到根据index取array元素 性能是不是受array.length所限
indexFor(hash, table.length)方法,其实取是很快的,关键是你不能做那么大的map,占用内存太大