一、题目
从键盘输入一个英文句子,统计该句子中的英文单词个数,并找出所有单词存放到一个数组中。同时,输出该句子中的不同单词和重复单词以及它们的个数。

二、实验代码

package fighting;
import java.util.Scanner;
import java.util.HashSet;
public class fighting
{
	public static void main(String[] args) 		
    {
		System.out.println("请输入英文句子:");
		Scanner sc=new Scanner(System.in);
		String str=sc.nextLine();
		StringBuffer str1=new StringBuffer();//StringBuffer为可变字符串
		for(int i=0;i<str.length();i++)
		{
			if(str.charAt(i)>='a'&&str.charAt(i)<='z'||str.charAt(i)>='A'&&str.charAt(i)<='Z')//判断英文单词,若连续若干字母即为一个英文单词,将其作为单词组成部分放入StringBuffer中
			{
				str1.append(str.charAt(i));
			}
			else//将单词用逗号隔开
			{
				str1.append(",");
			}
		}
		String[] str2=str1.toString().split(",");//先利用toString将StringBuffer转换为String类对象,再利用split方法按逗号将其分开存入数组
		System.out.println("该句子一共有"+str2.length+"个单词");
		System.out.println("-----------------------------");
	    for(int n=0;n<str2.length;n++)//遍历输出句子单词
	    {
	    	System.out.print(str2[n]+" ");
	    }
	    System.out.println();
	    System.out.println("-----------------------------");
	    
		HashSet<String> repeatedwords=new HashSet<String>();//用来存放重复单词集合
		HashSet<String> unrepeatedwords=new HashSet<String>();//用来存放不重复单词集合
		for(String token:str2)//增强型for循环,语法格式为for(集合内储存类型 变量名 : 集合变量名),定义一个String型变量token, 每次从数组str2里取一个元素付给变量token,直到把str2里的所有元素都处理完.
		{
			if(!unrepeatedwords.add(token))
			repeatedwords.add(token);//因为Set分支的特点是无序且不可重复,因此通过add方法添加相同的值时,第一次返回为true,后面再加相同元素的话就会返回false,因为元素重复
		}
		System.out.println("该句子不同的单词有"+unrepeatedwords.size()+"个  "+unrepeatedwords);//size()获取集合长度
		System.out.println("-----------------------------");
		System.out.println("该句子重复的单词有"+repeatedwords.size()+"个  "+repeatedwords);
		
    }
}

三、运行结果

java 统计单词频率 java统计单词数量_java 统计单词频率


四、实验总结

1、HashSet是set接口的实现类,是我们最常用的set集合,其储存的是无序,唯一的对象。因为是无序的所以每组数据都没有索引,凡是需要通过索引来进行操作的方法都没有,因此也不能使用普通for循环来进行遍历,只有增强型for和迭代器两种遍历方法

(1)增强型for循环的语法格式为:for(集合内储存类型 变量名 : 集合变量名),增强for循环只能用在数组或实现Interable接口的集合类上,增强型for循环只适合取数据,不会更改数据,如对更改数据有要求需要使用传统for循环方式。

HashSet<String> map=new HashSet<String>();
		map.add("hard");
		map.add("coder");
		for(String str:map)
			System.out.println(str+" ");//控制台显示的是coder harder(因为set无序)

(2)迭代器Iterator主要是提供一种方法对一个容器对象中的各个元素进行访问,其包含三个方法:hasNext,next和remove。Iterator可用来遍历Set和List集合,且只能是前向遍历。

public interface Iterator<E> {
    boolean hasNext(); //每次next()之前,先调用此方法探测是否迭代到终点,即判断是否存在下一个对象元素
    E next(); //返回当前迭代元素同时迭代游标后移,即获取下一个元素
    void remove() //删除最近一次已近迭代出出去的那个元素,只有当next执行完后,才能调用remove函数。比如要删除第一个元素,不能直接调用 remove() 而要先next一下( ); 在没有先调用next(0)就调用remove方法是会抛出异常
    {
        throw new UnsupportedOperationException("remove");
    }
}
HashSet<String> set=new HashSet<String>();
		set.add("aa");
		set.add("bb");
	    set.add("coder");
	    set.add("harder");
	    for(Iterator<String> iter=set.iterator();iter.hasNext();)
	    {
	    	String temp=iter.next();
	    	System.out.print(temp+" ");//控制台显示aa bb coder harder 
	    }

2、HashSet的五种方法:add(set)用来增加元素,remove(set)用来移除元素,contains(set)用来对比查找元素,clear()用来清空集合元素,size()用来获取集合长度。因为Set分支的特点是无序且不可重复,因此通过add方法添加相同的值时,第一次返回为true,后面再加相同元素的话就会返回false,因为元素重复,这一点值得注意。
3、使用HashSet和Iterator需要导包,否则会报错:HashSet cannot be resolved to a type和Iterator cannot be resolved to a type。

import java.util.HashSet;
import java.util.Iterator;