练习13:

单词计数器

 import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Map; import org.cc.foo_005.AssocitiveArray.AssocitiveArrayEntry; public class Main { public static void main(String[] args) { String path="D:/test_001/practice_002/1.Harry Potter and the Sorcerer's Stone.txt"; AssocitiveArray<String,Integer> ans=wordCount(path); Iterator<AssocitiveArrayEntry<String,Integer>> iter=ans.iterator();
while(iter.hasNext()){
AssocitiveArrayEntry<String,Integer> o=iter.next();
System.out.printf("%s=%d\n",o.getKey(),o.getValue());
} } public static AssocitiveArray<String,Integer> wordCount(String filePath){ BufferedReader reader=null;
AssocitiveArray<String,Integer> res=null; try {
reader=new BufferedReader(new InputStreamReader(new FileInputStream(filePath),"UTF-8"));
StringBuilder sb=new StringBuilder(); while(reader.ready()){
sb.append(reader.readLine());
} String words[]=sb.toString().split("[(\\s{1,})]"); res=new AssocitiveArray<String,Integer>(); for(String s:words){
if(!"".equals(s)){
Integer t=res.get(s);
res.put(s,t==null?1:t+1);
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(reader!=null) reader.close();
} catch (IOException e) {
e.printStackTrace();
}
} return res;
} } //关联数组
class AssocitiveArray<K, V> implements Iterable { //存储数据
private Object pairs[][];
//当前最大有效数据的下标+1,即下一个可用位置,类似于栈顶指针
private int index; public AssocitiveArray() {
this(17);
} public AssocitiveArray(int length) {
pairs=new Object[length][2];
} public void put(K key,V value){
//先检查,如果key已经存在的话就直接覆盖掉
for(int i=0;i<index;i++){
if(key.equals(pairs[i][0])){
pairs[i][1]=value;
return ;
}
}
//检查是否需要扩充空间
if(index==pairs.length) pairs=Arrays.copyOf(pairs,pairs.length*2);
pairs[index++]=new Object[]{key,value};
} public V get(K key){
for(int i=0;i<index;i++){
if(key.equals(pairs[i][0])) return (V) pairs[i][1];
}
return null;
} public V remove(K key){
for(int i=0;i<index;i++){
if(key.equals(pairs[i][0])){
V oldValue=(V) pairs[i][1];
pairs[i]=pairs[--index];
return oldValue;
}
}
return null;
} public int size(){
return index;
} @Override
public String toString() {
StringBuilder sb=new StringBuilder();
sb.append("[");
for(int i=0;i<index;i++){
sb.append(pairs[i][0]).append(":").append(pairs[i][1].toString());
if(i!=pairs.length-1) sb.append(",");
}
sb.append("]");
return sb.toString();
} @Override
public Iterator<AssocitiveArrayEntry<K,V>> iterator() {
return new Iterator<AssocitiveArrayEntry<K,V>>() { private int curIndex; @Override
public boolean hasNext() {
return curIndex<index;
} @Override
public AssocitiveArrayEntry<K,V> next() {
AssocitiveArrayEntry<K,V> ans=new AssocitiveArrayEntry<K,V>((K)pairs[curIndex][0],(V)pairs[curIndex][1]);
curIndex++;
return ans;
} @Override
public void remove() {
throw new UnsupportedOperationException();
}
};
} static class AssocitiveArrayEntry<K,V> implements Map.Entry<K,V>{ private K key;
private V value; public AssocitiveArrayEntry(K key, V value) {
super();
this.key = key;
this.value = value;
} @Override
public K getKey() {
return key;
} @Override
public V getValue() {
return value;
} @Override
public V setValue(Object value) {
throw new UnsupportedOperationException();
} } }

测试结果如图:

《Thinking in Java》十七章_容器深入研究_练习13(Page484)的更多相关文章

  1. 《Thinking in Java》十七章_容器深入研究_练习12(Page484)

    练习12: 练习使用HashMap / LinkedHashMap / TreeMap import java.util.HashMap; import java.util.LinkedHashMap ...

  2. 《Thinking in Java》十七章_容器深入研究_练习14(Page486)

    练习14 Properties的继承树如下:

  3. “全栈2019”Java多线程第三十七章:如何让等待的线程无法被中断

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  4. “全栈2019”Java多线程第二十七章:Lock获取lock/释放unlock锁

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  5. “全栈2019”Java多线程第十七章:同步锁详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  6. “全栈2019”Java异常第十七章:Error详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

  7. “全栈2019”Java第九十七章:在方法中访问局部内部类成员详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  8. “全栈2019”Java第八十七章:类中嵌套接口的应用场景(拔高题)

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  9. “全栈2019”Java第七十七章:抽象内部类与抽象静态内部类详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

随机推荐

  1. Android 网络请求框架android-async-http问题

    今天通过接口请求服务器的一些app数据,发现一个很奇怪的问题,请求一个链接的时候,通常在第一次请求发起的时候没有什么问题,能很快的拿到数据,但是 往后再去请求的时候就会等待很久,而且最后会请求失败,一 ...

  2. 淘宝(阿里百川)手机客户端开发日记第十二篇 mysql的认识

    我这里用的是wamp,大家可以到网上去下载对应的包,自行安装,对于程序员来讲,安装软件大部分都应该不是问题的,所以我不去将具体安装的方法. wamp安装好后,在我们屏幕的右下角, 这样的图标,我们右键 ...

  3. iOS开发——项目篇—高仿百思不得姐

    01 一.包装为导航控制器 UINavigationController *nav = [[UINavigationController alloc] initWithRootViewControll ...

  4. matlab随笔(三)

    把矩阵变成行向量(矩阵元素的排列是从上到下,从左到右): 1.先转置,转成行向量 A = >> A=A' A = >> a=A(:)' a = 2.reshape函数 A = ...

  5. composer 的使用

    composer是php包管理工具,非常好用!许多框架,例如zendframework都可以用它来安装. 使用起来其实是很简单的.以下以windowns操作系统为例: 把php添加到系统环境变量.(网 ...

  6. MySQL用法

    查询数据库表 通过查询INFORMATION_SCHEMA.TABLES查询数据库表的结构信息 SELECT  *  FROM  INFORMATION_SCHEMA.TABLES WHERE TAB ...

  7. midi格式

    http://www.ccarh.org/courses/253/handout/smf/

  8. 【GoLang】并发小结

    006.并发 1 概念 1.1 goroutine是Go并行设计的核心,goroutine的本质是轻量级线程 1.2 golang的runtime实现了对轻量级线程即goroutine的智能调度管理 ...

  9. docker -v挂载数据卷网络异常的问题

    docker 删除容器并重新运行容器时报如下异常: docker: Error response from daemon: failed to create endpoint tomcat001 on ...

  10. ios 修正waring:Method override for the designated initializer of the superclass '-init' not found

    swift引入后,为了使oc和swift更相近,对oc的初始化方法也进行了修正,具体说明,见下面的链接,这个waring的最简单的修正方法是,到相应类的头文件中,去掉在自定义初始化方法后面的 NS_D ...