java对文章字符出现个数进行统计排序(TreeMap排序)


任务所涉及到的排序问题,由于需要对文本字符及文字字符出现的次数进行排序,相当于一个关键字(key值)和对应次数(value值),而Map排序可以很好的解决该问题,下面对Map排序进行具体介绍。

1.介绍Map

map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等。其中这四者的区别如下(简单介绍):

HashMap:我们最常用的Map,它根据key的HashCode 值来存储数据,根据key可以直接获取它的Value,同时它具有很快的访问速度。HashMap最多只允许一条记录的key值为Null(多条会覆盖);允许多条记录的Value为 Null。非同步的。

TreeMap: 能够把它保存的记录根据key排序,默认是按升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的(默认升序)。TreeMap不允许key的值为null。非同步的。

Hashtable: 与 HashMap类似,不同的是:key和value的值均不允许为null;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtale在写入时会比较慢。

LinkedHashMap: 保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.在遍历的时候会比HashMap慢。key和value均允许为空,非同步的。

2.TreeMap排序

TreeMap默认是升序的,如果我们需要改变排序方式,则需要使用比较器:Comparator。
Comparator可以对集合对象或者数组进行排序的比较器接口,实现该接口的public compare(T o1,To2)方法即可实现排序,该方法主要是根据第一个参数o1,小于、等于或者大于o2分别返回负整数、0或者正整数。

2.1根据TreeMap的key值来进行排序

2.1.1根据key值的升序排序(默认)

代码如下:

//文件名:MapSortDemo.java
import java.io.*;
import java.util.*;
import java.util.Map.Entry;
class MapSortDemo 
{
    public static void main(String[] args) 
	{
        Map<String, String> map = new TreeMap<String, String>();//定义一个TreeMap
        map.put("c", "5");//在TreeMap中添加值
        map.put("a", "7");
        map.put("b", "3");
        map.put("d", "1");

		Set<String> keySet = map.keySet();
        Iterator<String> iter = keySet.iterator();
        while (iter.hasNext()) 
		{
            String key = iter.next();
            System.out.println(key + ": <" + map.get(key)+ "次>  ");
        }
	}
}

结果如下:
在这里插入图片描述

2.1.2根据key值的降序排序

代码如下:

//文件名:MapSortDemo1.java
import java.io.*;
import java.util.*;
import java.util.Map.Entry;
public class MapSortDemo1 
{
    public static void main(String[] args)
	{
		//定义一个TreeMap
        Map<String, String> map = new TreeMap<String, String>(
                new Comparator<String>() {
                    public int compare(String obj1, String obj2) 
					{
                        // 降序排序
                        return obj2.compareTo(obj1);
                    }
                });
        map.put("c", "5");//在TreeMap中添加值
        map.put("a", "7");
        map.put("b", "3");
        map.put("d", "1");

        Set<String> keySet = map.keySet();
        Iterator<String> iter = keySet.iterator();
        while (iter.hasNext()) 
		{
            String key = iter.next();
            System.out.println(key + ": <" + map.get(key)+ "次>  ");
        }
    }
}

结果如下:
在这里插入图片描述

2.2根据TreeMap的Value值来进行排序

对value排序我们就需要借助于Collections的sort(List list, Comparator<? super T> c)方法,该方法根据指定比较器产生的顺序对指定列表进行排序。但是有一个前提条件,那就是所有的元素都必须能够根据所提供的比较器来进行比较。

2.2.1根据Value值的升序排序

代码如下:

//文件名:MapSortDemo2.java
import java.io.*;
import java.util.*;
import java.util.Map.Entry;
class MapSortDemo2 
{
    public static void main(String[] args) 
	{
        Map<String, String> map = new TreeMap<String, String>();//定义一个TreeMap
        map.put("d", "5");//在TreeMap中添加值
        map.put("b", "7");
        map.put("a", "3");
        map.put("c", "1");

        //这里将map.entrySet()转换成list
        List<Map.Entry<String,String>> list = new ArrayList<Map.Entry<String,String>>(map.entrySet());
        //通过比较器来实现排序
        Collections.sort(list,new Comparator<Map.Entry<String,String>>() 
		{
            //升序排序
            public int compare(Entry<String, String> o1,Entry<String, String> o2) 
			{
                return o1.getValue().compareTo(o2.getValue());
            }
        });
        for(Map.Entry<String,String> mapping:list)
		{ 
            System.out.println(mapping.getKey()+ ": <"+mapping.getValue()+ "次>  "); 
        } 
    }
}

结果如下:
在这里插入图片描述

2.2.2根据Value值的降序排序

代码如下:

//文件名:MapSortDemo3.java
import java.io.*;
import java.util.*;
import java.util.Map.Entry;
class MapSortDemo3 
{
    public static void main(String[] args) 
	{
        Map<String, String> map = new TreeMap<String, String>();//定义一个TreeMap
        map.put("d", "5");//在TreeMap中添加值
        map.put("b", "7");
        map.put("a", "3");
        map.put("c", "1");

        //这里将map.entrySet()转换成list
        List<Map.Entry<String,String>> list = new ArrayList<Map.Entry<String,String>>(map.entrySet());
        //通过比较器来实现排序
        Collections.sort(list,new Comparator<Map.Entry<String,String>>() 
		{
            //降序排序
            public int compare(Entry<String, String> o1,Entry<String, String> o2) 
			{
                return o2.getValue().compareTo(o1.getValue());
            }
        });
        for(Map.Entry<String,String> mapping:list)
		{ 
            System.out.println(mapping.getKey()+ ": <"+mapping.getValue()+ "次>  "); 
        } 
    }
}

结果如下:
在这里插入图片描述

3.实例:对《西游记》中的字符进行降序排序

代码如下:

//文件名:Stat1.java
import java.io.*;
import java.util.*;
import java.util.Map.*; 

class Stat1
{
	public static void main(String[] args) throws IOException
	{
		long startTime = System.currentTimeMillis();//定义一个开始时间
		stat(new File(args[0]));//创建一个文件对象
		long endTime = System.currentTimeMillis();//定义一个结束时间
		System.out.println("\n耗时:" + (endTime - startTime) + "毫秒");//输出所用时间
	} 
	public static void stat(File file) throws IOException
	{
        BufferedReader br = null;   					//定义字符读取(缓冲)流
        br = new BufferedReader(new FileReader(file));	//给该流赋值
        String value = null; 							//定义一个临时接收文件中的字符串变量
        String newValue ="";    						//接收文件中所有字符串的变量
        while((value = br.readLine()) != null)			//开始读取文件中的字符
		{    	
             newValue = newValue + value;    			//存入newValue变量中
        }
        char[] ch = newValue.toCharArray();				//把newValue变成字符数组
        TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>(); //定义一个TreeMap,默认从小到大顺序,键对应字符,值对应字符出现的次数
        for(int x = 0;x < ch.length; x++)				//遍历ch,将ch中所有的字符存入一个Map集合中(TreeSet),键对应字符,值对应字符出现的次数
		{   			
            char c = ch[x];
            if(tm.containsKey(c))//如果TreeMap(tm)中有该键,则取出该键中的值,也就是出现的次数
			{  					
                int count = tm.get(c);
                tm.put(c, count + 1);  					//把新值存入tm集合中,如果键相同的话, 新键会替换老键,值也随着变化了
            }
            else										//如果没有出现该键就说明是第一次出现,存入1次
			{
                tm.put(c, 1);  							
            }
        }
		List<Map.Entry<Character,Integer>> list = new ArrayList<Map.Entry<Character,Integer>>(tm.entrySet()); //这里将map.entrySet()转换成list
		Collections.sort(list,new Comparator<Map.Entry<Character,Integer>>()   //通过比较器来实现排序
		{
			public int compare(Entry<Character,Integer> o1,Entry<Character,Integer> o2)  //降序排序
			{
				return o2.getValue().compareTo(o1.getValue());
			}
		});
		for(Map.Entry<Character,Integer> mapping:list)
		{
			System.out.println(mapping.getKey()+":"+mapping.getValue()); //输出排序后的字符
		}
    }
}

结果如下:
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

除去标点符号,显然,“道”字出现的频率是最高的,“道”即“说”的意思,可以推断出本书中的对话居多。以此为基础,后续我们就可以做提取文章关键词等。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值