文章目录
- 1.介绍Map
- 2.TreeMap排序
- 2.1根据TreeMap的key值来进行排序
- 2.1.1根据key值的升序排序(默认)
- 2.1.2根据key值的降序排序
- 2.2根据TreeMap的Value值来进行排序
- 2.2.1根据Value值的升序排序
- 2.2.2根据Value值的降序排序
- 3.实例:对《西游记》中的字符进行降序排序
任务所涉及到的排序问题,由于需要对文本字符及文字字符出现的次数进行排序,相当于一个关键字(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()); //输出排序后的字符
}
}
}
结果如下:
除去标点符号,显然,“道”字出现的频率是最高的,“道”即“说”的意思,可以推断出本书中的对话居多。以此为基础,后续我们就可以做提取文章关键词等。