代码目的:计算一段文本中重复出现的词的个数。
分两种情况:
1.文本在内存中
2.文本在硬盘文件上
方案利用ArrayList
声明一个类
public class Entity
{
String word;
float pValue;
public Entity()
{
pValue=0;
word="";
}
}
1.文本在内存中主类中有以下代码
String []words={"小","团圆","究竟","泄了","张爱玲","什么","秘密","2009年","04月","08日","09:56","天天","小","团圆","究竟","哈哈","张爱玲","全额","天涯","张爱玲"};
ArrayList<Entity> enList=new ArrayList();
for(String w: words)
{ w=w.trim();
Entity en=new Entity();
en.word=w;
en.pValue=1;
enList.add(en);
//System.out.println(w);
}
for(int i=0;i<enList.size()-1;i++)
{
if(!enList.get(i).word.isEmpty())
{
for(int j=i+1;j<enList.size();j++)
{
if(enList.get(i).word==enList.get(j).word)
{
enList.get(i).pValue++;
enList.get(j).pValue=0;
enList.get(j).word="";
}
}
}
}
for(Entity e : enList)
{
System.out.println(e.word+e.pValue);
}
System.out.println(enList.size());
结果如下
| 小2.0团圆2.0究竟2.0泄了1.0张爱玲3.0什么1.0秘密1.02009年1.004月1.0 |
2.文本在硬盘文件中
主类代码如下
public static void main(String[] args) throws FileNotFoundException,IOException
{
// TODO Auto-generated method stub;
String result=CutText("E:/自然语言处理/KL/sb.txt");
String []words=result.split("\\|");
ArrayList<Entity> enList=new ArrayList();
for(String w: words)
{ w=w.trim();
Entity en=new Entity();
en.word=w;
en.pValue=1;
enList.add(en);
//System.out.println(w);
}
for(int i=0;i<enList.size()-1;i++)
{
if(!enList.get(i).word.isEmpty())
{
for(int j=i+1;j<enList.size();j++)
{
if(enList.get(i).word==enList.get(j).word)
{
enList.get(i).pValue++;
enList.get(j).pValue=0;
enList.get(j).word="";
}
}
}
}
for(Entity e : enList)
{
System.out.println(e.word+e.pValue);
}
System.out.println(enList.size());
}
结果如下:
| 小1.0团圆1.0究竟1.0泄了1.0张爱玲1.0什么1.0秘密1.02009年1.004月1.0 |
可以看出当从硬盘中读文件后,该方法没有有效统计处文本中同一个词出现的个数
读取硬盘文件的函数以及分词函数如下
public static String GetFileText(String path) throws FileNotFoundException,IOException
{
InputStreamReader inStreamReader=new InputStreamReader(new FileInputStream(path));
//String strFile1=
BufferedReader bufReader=new BufferedReader(inStreamReader);
String line;
StringBuilder sb=new StringBuilder();
while((line=bufReader.readLine())!=null)
{
sb.append(line+" ");
}
inStreamReader.close();
bufReader.close();
String strFile=sb.toString();
return strFile;
}
/*this function cut a piece of text in to words sequeces*/
public static String CutText(String path)throws FileNotFoundException,IOException
{
String fileText=GetFileText(path);
MMAnalyzer analyzer=new MMAnalyzer();
String result =null;
String spliter="|";
try
{
result = analyzer.segment(fileText, spliter);
}
catch (IOException e)
{
e.printStackTrace();
}
//System.out.print(result);
return result;
}
但是如果将:
if(enList.get(i).word==enList.get(j).word)
{
enList.get(i).pValue++;
enList.get(j).pValue=0;
enList.get(j).word="";
}
改为
if([color=cyan]enList.get(i).word.equals(enList.get(j).word))[/color]
{
enList.get(i).pValue++;
enList.get(j).pValue=0;
enList.get(j).word="";
}
则两种情况下都能正确统计出同一个词的出现次数这是为啥呢?
为了方便大家研究,我把这段代码上传,其中用到了jeasey分词器,和lucene.jar
分享到:
相关推荐
集合ArrayList测试集合ArrayList测试集合ArrayList测试集合ArrayList测试集合ArrayList测试集合ArrayList测试
采用双层散列实现的一个ArrayList类模板,可以支持20M以上个数的对象的列表,利用双层链表做的一个散列实现,查询、插入的执行效率非常快。
在jni中操作arraylist对象,然后添加一个int型数据进去
arrayList排序arrayList排序arrayList排序
arraylist .
原来的ArrayList.h文件发现下载下来后在MFC中引入后不能使用,所以稍微整理了一下现在可以用了
什么是ArrayList? 如何使用ArrayList? ArrayList重要的方法和属性?
Remove 從 ArrayList 中移除特定對象的第一個匹配項 RemoveAt 移除 ArrayList 的指定索引處的元素 Insert 將元素插入 ArrayList 的指定索引處 ArrayList arrlist = new ArrayList(); //..使用 Add方法在 ...
java下的一个demo,关于arraylist的用法
一个C++(Ubuntu16.04+QT5.9.1)通过JNI,调用JAVA类及方法的示例。通过JNI传递和返回多种类型的参数,boolean ,int,String,ArrayList,ArrayList嵌套ArrayList<ArrayList<String>>等。
C语言版的ArrayList,具有ArrayList的基本方法增加、插入、删除、自动扩容等。
System.Collections.ArrayList类是一个特殊的数组。通过添加和删除元素,就可以动态改变数组的长度。
ASP .NET - ArrayList对象ASP .NET - ArrayList对象ASP .NET - ArrayList对象ASP .NET - ArrayList对象
告诉我们如何来学习将arrayList进行运用,这是关于C#的程序
java.util包中的ArrayList很常用,参考jdk源码中的ArrayList.java,写了一个c版的ArrayList,目前仅坚持 char *(字符串) 和 int (整型).
ArrayList最新源码,基于Jdk1.8
自己写的ArrayList,能实现添加、同级个数、获取值
ArrayList转化为DataTable数据加载转换方便程序的灵活运用!
遍历ArrayList存入HashMap中
使用对象ArrayList填充DataGrid,C#源代码ArrayList MyList = new ArrayList();