kwic--Java统计单词个数并按照顺序输出
Posted 邗影
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kwic--Java统计单词个数并按照顺序输出相关的知识,希望对你有一定的参考价值。
2016-07-02(随笔写作时间)
写了好久的程序了为了避免以后用到。。。。。。。。。。
是一个统计单词个数,并按照个数从大到小输出的。输入文件名OK 了
单词是按照首字母排序的,,,里面用到映射等,,,注意重写比较函数,因为我们是要按值排序,而不是一般的按照键排序,,,,我们要输出的由多到少的个数,,,有个数是重复的
if (base.get(a) >=base.get(b)) {
return -1; //注意 不要返回0 会删除重复
} 就起到了关键作用。
由于我们要按照个数多少排序,所以记得重写比较函数,为啥不能让数字做键,因为键不能重复,所以这里单词是键,OK 。
详见code吧,写的乱,但是实现了具体要求,,,,
str.split("\\s+");这里记录分隔符
正则表达式,
\\d表示 0-9 的数字,
\\s表示 空格,回车,换行等空白符,
\\w表示单词字符(数字字母下划线)
+号表示一个或多个的意思
1 package calnum; 2 3 import java.io.BufferedReader; 4 import java.io.FileNotFoundException; 5 import java.io.FileReader; 6 import java.io.IOException; 7 import java.nio.Buffer; 8 import java.nio.ShortBuffer; 9 import java.util.ArrayList; 10 import java.util.Collections; 11 import java.util.Comparator; 12 import java.util.HashMap; 13 import java.util.Iterator; 14 import java.util.List; 15 import java.util.Map; 16 import java.util.Map.Entry; 17 import java.util.Scanner; 18 import java.util.TreeMap; 19 20 import javax.swing.Spring; 21 import javax.swing.text.html.parser.Entity; 22 23 public class calwordnum{ 24 25 public String readfile() throws IOException { 26 String all = null; 27 // System.out.print("##########################"); 28 Scanner cin = new Scanner(System.in); 29 System.out.print("plz input file name:"); 30 String filename = cin.next(); 31 FileReader read = new FileReader(filename); 32 BufferedReader re = new BufferedReader(read); 33 StringBuffer strbuf = new StringBuffer(); 34 35 String ss; 36 while ((ss = re.readLine()) != null) { 37 strbuf.append(ss); 38 //读全文 39 } 40 41 return strbuf.toString(); 42 43 } 44 45 // 46 public String[] input(String str) { 47 String[] arr = str.split("\\s+"); 48 49 return arr; 50 } 51 52 public void putmap(List<String> ls) { 53 String temp, theword = null; 54 int flage = 0; 55 theword = ls.get(0); 56 Map<String, Integer> map = new HashMap<String, Integer>(); 57 Iterator it = ls.iterator(); 58 while (it.hasNext()) { 59 // System.out.println("sss"+it.next().toString()); 60 temp = it.next().toString(); 61 62 if (temp.equals(theword)) { 63 flage++; 64 continue; 65 } else { 66 map.put(theword, flage); 67 flage = 1; 68 theword = temp; 69 70 } 71 } 72 73 map.put(theword, flage); 74 //重写比较方法,treemap按值排序。用两个map 比较函数需要参数 75 ValueComparator bvc = new ValueComparator(map); 76 Map<String,Integer> map2 = new TreeMap<String,Integer>(bvc); 77 map2.putAll(map); 78 Iterator mapit = map2.entrySet().iterator(); 79 while (mapit.hasNext()) { 80 Entry tr = (Entry) mapit.next(); 81 82 String num = (String) tr.getKey(); 83 int sa = (Integer) tr.getValue(); 84 System.out.println("this word:"+num + " has:" + sa + "个"); 85 } 86 87 } 88 89 // / 90 public static void main(String[] args) throws IOException { 91 // TODO Auto-generated method stub 92 List<String> ls = new ArrayList<String>(); 93 94 calwordnum ca = new calwordnum(); 95 96 String allword = ca.readfile(); 97 String[] arr = ca.input(allword); 98 for (int i = 0; i < arr.length; i++) { 99 100 ls.add(arr[i].toLowerCase()); 101 } 102 103 Collections.sort(ls); 104 display(ls); 105 ca.putmap(ls); 106 107 } 108 109 @Override 110 public boolean equals(Object obj) { 111 // TODO Auto-generated method stub 112 return super.equals(obj); 113 } 114 115 private static void display(List<String> ls) { 116 // TODO Auto-generated method stub 117 118 for (String s : ls) 119 System.out.println(s); 120 } 121 122 } 123 // 124 class ValueComparator implements Comparator<String> { 125 126 Map<String, Integer> base; 127 public ValueComparator(Map<String, Integer> base) { 128 this.base = base; 129 } 130 131 132 public int compare(String a, String b) { 133 if (base.get(a) >=base.get(b)) { 134 return -1; //注意 不要返回0 会删除重复 135 } 136 137 else { 138 return 1; 139 } 140 } 141 }
不截图了,运行了之后输入文件名就行,如果你的分隔符不是//s+能满足的,麻烦自行修改。出来的结果就是单词,单词个数,一溜溜,,,可运行,没错误。但是可能有考虑步骤的地方。望批评指正
以上是关于kwic--Java统计单词个数并按照顺序输出的主要内容,如果未能解决你的问题,请参考以下文章
java中,给定一个文本,统计其中的单词个数,要求以单词在文本中出现的先后顺序输出
Python里,输入一个英文句子,统计并输出单词个数,怎么弄啊,