package com.DocExpansion.TFIDF;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
public class TFfreq {
public static HashMap<String,String> TFfreq(ArrayList<String> terms){
//计算词频
HashMap<String,String> resTF=new HashMap<String,String>();
HashMap<String,Integer> TFtimes=TFfreq.TFtimes(terms);
int length=terms.size();
System.out.println(length);
//遍历Map的value
Iterator iter=TFtimes.entrySet().iterator();
while(iter.hasNext()){
Map.Entry entry=(Map.Entry)iter.next();
//当两个整数相除时,由于小数点以后的数字会被截断,使运算结果为整数,
//故此时若希望得到运算结果为所预期的浮点数,则此时必须将两整数其一或是全部强制转换类型为浮点数。
DecimalFormat decimalFormat = new DecimalFormat("#,##0.0000000000");//格式化设置
float freq=Float.parseFloat(entry.getValue().toString())/length;
resTF.put(entry.getKey().toString(),decimalFormat.format(freq));
}
return resTF;
}
public static HashMap<String,Integer> TFtimes(ArrayList<String> terms){
//统计词出现的次数
HashMap<String,Integer> TFtimes=new HashMap<String,Integer>();
for(String term:terms){
if(!TFtimes.containsKey(term)){
TFtimes.put(term, 1);
}
else {
TFtimes.put(term, TFtimes.get(term)+1);
}
}
//因为Iterator在循环的时候是不可以删除元素的。
/*Iterator it=TFtimes.keySet().iterator();
while(it.hasNext()){
Object key=it.next();
if(TFtimes.get(key)>2&&TFtimes.get(key)<1000){
TFtimes.remove(key);
}
}*/
//遍历HashMap
//1、使用迭代器遍历Map的值,根据键取值
Iterator it=TFtimes.keySet().iterator();
while(it.hasNext()){
Object key=it.next();
Object value=TFtimes.get(key);
System.out.println("-------"+key+" "+value);
}
//2、使用迭代器遍历Map的记录Map.Entry
Iterator iter=TFtimes.entrySet().iterator();
while(iter.hasNext()){
//一个Map.Entry代表一条记录
Map.Entry entry=(Map.Entry)iter.next();
//通过entry可以获得记录的键和值
Object key=entry.getKey();
Object value=entry.getValue();
System.out.println("++++++++"+key+" "+value);
}
return TFfreq.Sort(TFtimes);
}
//排序HashMap并删除元素
public static HashMap<String,Integer> Sort(HashMap<String,Integer> map){
HashMap<String,Integer> resMap=new HashMap<String,Integer>();
List<Map.Entry<String, Integer>> infoIds=new ArrayList<Map.Entry<String,Integer>>(map.entrySet());
Collections.sort(infoIds,new Comparator<Map.Entry<String, Integer>>(){
public int compare(Map.Entry<String, Integer> o1,Map.Entry<String, Integer> o2){
//根据value排序,整型
return(o1.getValue()-o2.getValue());
//根据key排序,字符型
// return(o1.getKey().toString().compareTo(o2.toString()));
}
});
//根据值的大小删除元素
for(int i=0;i<infoIds.size();i++){
Entry<String,Integer> id=infoIds.get(i);
if(id.getValue()>2&&id.getValue()<1000){
resMap.put(id.getKey(), id.getValue());
}
}
return resMap;
}
}
[size=large][color=red]删除集合中的某些元素。有些可能会这么写。[/color][/size]
Iterator it=TFtimes.keySet().iterator();
while(it.hasNext()){
Object key=it.next();
if(TFtimes.get(key)>2&&TFtimes.get(key)<1000){
TFtimes.remove(key);
}
}
[size=large][color=red]Exception in thread "main" java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:793)
at java.util.HashMap$KeyIterator.next(HashMap.java:828)[/color][/size]
因为Iterator在循环的时候是不可以删除元素的。