`

报告ArrayList的一个错误,大家一起来研究下

阅读更多
代码目的:计算一段文本中重复出现的词的个数。
分两种情况:
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

分享到:
评论
4 楼 finallyliuyu 2010-03-08  
非常感谢你
3 楼 抛出异常的爱 2010-03-07  
finallyliuyu 写道
抛出异常的爱 写道
enList.get(i).word==enList.get(j).word

string pool

string pool是什么意思?
能详细说下嘛?我刚开始用java

他们能达成==不是由于他们的值相等
而是凑巧他们是从同一个池中得到的两个引用。。。。。

值等在java中只有equle.
==比的是引用。
2 楼 finallyliuyu 2010-03-07  
抛出异常的爱 写道
enList.get(i).word==enList.get(j).word

string pool

string pool是什么意思?
能详细说下嘛?我刚开始用java
1 楼 抛出异常的爱 2010-03-07  
enList.get(i).word==enList.get(j).word

string pool

相关推荐

    ptf4--------JAVA经典教程

    这表明提供的教程资料可能是一个PDF文档,编号为5,可能是整个系列中的第五个文件,或者与"PTF4"相呼应,可能是其中的一个补充材料或案例研究。 综上所述,尽管描述部分没有提供任何具体信息,我们可以推测这份"ptf...

    SlidingPuzzle JAVA程序

    例如,如果用户试图交换不在同一行或同一列的两个数字块,程序应当提示错误并阻止操作。 ### 9. 源码结构 在`MiniProjectCode`文件中,我们可以看到整个项目的代码结构,包括类定义、方法实现、变量声明等。通过...

    安卓树形控件相关-Android创建任意层次结构开发Demo直接拿来用.zip

    总的来说,这个压缩包为安卓开发者提供了一个实践树形控件的实例,通过深入研究和调试这个Demo,开发者可以学习到如何在Android平台上构建具有任意层次结构的用户界面,这对于开发复杂的数据展示和交互功能是十分有...

    pinterest-like-adapter-view-master瀑布流

    瀑布流布局,也被称为Pinterest样式布局,是一种在网页或移动应用中常见的展示方式,尤其在社交分享、图片浏览等场景下应用广泛。这种布局模仿了Pinterest网站的设计,以多列形式展示内容,使得页面看起来像流水一样...

    javaexamples164

    其次,`javaexamples164`这个文件名看起来像是一个目录或文件夹,而非单独的文件。这通常意味着它可能包含了多个Java源代码文件(`.java`),示例类或者项目结构。在Java开发中,组织代码的方式很重要,常见的做法是...

    安卓Android源码——轻松实现语音识别.rar

    `results`中包含一个ArrayList,每个元素都是一个含有多条可能匹配结果的数组。示例代码如下: ```java @Override public void onResults(Bundle results) { ArrayList&lt;String&gt; voiceResults = results....

    listview动态添加、删除带edittext的item

    在这个Adapter中,你需要维护一个数据集合,比如ArrayList,用于存储每个Item的EditText内容。 2. **ViewHolder**:实现ViewHolder模式,这样可以更高效地重用View。ViewHolder中包含对EditText的引用,便于快速...

    C#窗体选项卡中datagridview的运用

    在Windows Forms中,TabControl允许我们将多个窗体或内容区域组织到不同的选项卡下,提供了一种简洁的方式来展示和切换不同视图。在选项卡中嵌入DataGridView,可以使用户在一个界面上处理多个数据集,从而提高应用...

    二十三种设计模式【PDF版】

    有经验的面向对象设计者会告诉你,要一下子就得到复用性和灵活性好的设计, 即使不是不可能的至少也是非常困难的。一个设计在最终完成之前常要被复用好几次,而且每一次都有所修改。 有经验的面向对象设计者的确能...

    java学习笔记及设计模式

    9. **策略模式**:定义了一系列算法,并将每一个算法封装起来,使它们可以互相替换,让算法的变化独立于使用算法的客户。 通过学习这些设计模式,开发者能够更好地理解和应用软件设计原则,提高代码的复用性和可...

    java事例集合1

    【标题】"Java事例集合1"显然与Java编程语言相关,这可能是一个包含多个Java编程实例的资源包。在Java编程中,实例通常指的是具体的代码示例,用于展示某个概念或技术的运用。这个标题暗示我们可能会找到一系列用于...

    基于python+Java的疫情爬虫数据分类统计分析的设计与实现【附源码】

    在本项目中,“基于python+Java的疫情爬虫数据分类统计分析的设计与实现”是一个结合了两种编程语言的综合应用,旨在从网络上抓取疫情相关的数据,进行处理、分类和统计分析。该项目的核心目标是利用Python的爬虫...

    Java联想(中文)

    Java是一种广泛使用的面向对象的编程语言,以其跨平台、高性能和丰富的类库而著名。"Java联想"这个主题可能指的是通过各种概念、技术或者最佳..."Java联想"可以帮助你将这些知识点串联起来,形成一个完整的知识体系。

    java火车票订购程序源码

    Java火车票订购程序源码是一个基于Java Swing开发的桌面应用程序,它主要用于模拟和实现火车票的预订流程。Java Swing是Java Foundation Classes (JFC)的一部分,提供了丰富的图形用户界面(GUI)组件,使得开发者...

    JAVA 架构师直通车练习项目.zip

    【压缩包子文件的文件名称列表】"5575757faga"看起来像是一个随机生成的文件名,这可能是一个错误或者是因为安全原因而省略了实际的文件名。在实际的项目中,压缩包通常会包含源代码文件(如.java)、配置文件(如....

    java图书管理系统

    《Java图书管理系统》是一款基于Java技术开发的毕业设计项目,旨在提供一个高效、便捷的图书管理解决方案。这个系统集成了图书的入库、出库、查询、借阅、归还等功能,实现了图书馆日常运营的核心业务流程。当年,这...

    JAVA程序设计范例

    总结起来,"JAVA程序设计范例"是一个全面的学习资源,涵盖了Java编程的基础和高级概念,旨在帮助学习者掌握Java语言,理解面向对象编程思想,并通过实际示例提升编程技能。通过仔细研究提供的文件,无论是初学者还是...

    android 仿建行首页转盘源码

    源码中可能会有一个数据结构(如`ArrayList`)来存储这些数据,然后在绘制转盘时根据数据来决定扇区的数量、颜色和文字。 4. **动画控制**:为了模拟真实的物理效果,转盘在停止时可能需要添加阻尼动画,使得转盘...

    数据结构与算法分析(java语言描述)第二版 课后习题答案

    数据结构与算法分析是计算机科学与软件工程领域的核心课程之一,它主要研究如何有效地存储、处理和组织数据,以及如何设计能够解决特定问题的算法。以下是从标题和描述中提取的知识点: 1. 数据结构基础: - 列表...

    《LINQ入门与应用》内容之一

    **LINQ(Language Integrated Query,语言集成查询)**是.NET框架中的一个重要组成部分,它为C#和Visual Basic等编程语言提供了强大的数据查询能力。在.NET 3.5版本中引入,LINQ允许开发者以一种更自然、更符合编程...

Global site tag (gtag.js) - Google Analytics