您的位置:首页 > 编程语言 > Java开发

java持有对象-map(二)-追踪元素次数

2016-04-12 17:00 731 查看
这篇文章的练习题在面试题中经常考到,关于map的用法也比前篇要深入。

练习一:追踪每一个元音字母出现的次数。

/**
*
* 书上用了自己编译的一个工具类,但是很奇怪的是通过构造方法能获得list。
* 虽然我大致模拟了工具类效果,但里面代码不知道怎么实现的
* 感觉虽然是一个练习题,但有极强的可扩展性,这一点比我平时编程习惯强太多了
*
*/
package elevenObject;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
//这是我自己写的工具类,传入一个文件名和你要分割的条件
class TextFile {

public List<String> resource(String fileName, String match) {
File file = new File(fileName);//创建文件
List<String> results = new ArrayList<String>();
try {

BufferedReader reader = new BufferedReader(new FileReader(file));

String line = null;
while (!((line = reader.readLine()) == null)) {

results.addAll(Arrays.asList(line.split(match)));

}

reader.close();

} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return results;
}

}

public class TestExcFour {
//vowel 元音字母集合
private static final Set<Character> vowel = new HashSet<Character>(
Arrays.asList('a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'));
//更新查询结果
static void updataSta(Map<Character, Integer> sta, Character letter) {
Character ch = Character.toLowerCase(letter);
Integer freq = sta.get(ch);
sta.put(ch, freq == null ? 1 : freq + 1);//更新

}

public static void main(String[] args) {
//单词中元音次数
Map<Character, Integer> fileSta = new HashMap<Character, Integer>();
//文件中元音出现的次数
Map<Character, Integer> worldSta = new HashMap<Character, Integer>();
Set<String> worlds = new HashSet<String>();
//从vowel.txt中以非字母分割,获得一个list集合
for (String word : new TextFile().resource("vowel.txt", "\\W+")) {
worldSta.clear();
for (char letter : word.toCharArray()) {
if (vowel.contains(letter)) {
updataSta(fileSta, letter);//更新文件中
updataSta(worldSta, letter);//更新单词中
}

if (!worlds.contains(letter)) {
worlds.add(word);

}
}
System.out.println("voel in " + word + worldSta);

}
System.out.println("filesta is" + fileSta);
}

}


输出式样(我在根目录建立一个vowel.txt内容为:Look at the stars in the sky,that’s all my wishes especiallly for you):

vowel in Look{o=2}

vowel in at{a=1}

vowel in the{e=1}

vowel in stars{a=1}

vowel in in{i=1}

vowel in the{e=1}

vowel in sky{}

vowel in that{a=1}

vowel in s{}

vowel in all{a=1}

vowel in my{}

vowel in wishes{e=1, i=1}

vowel in especiallly{a=1, e=2, i=1}

vowel in for{o=1}

vowel in you{u=1, o=1}

filesta is{a=5, e=5, u=1, i=3, o=4}

练习二:对一个文件中出现的单词计数。使用带有第二参数的String.CASE_INSENTIVE_ORDERED

的Collection.sort()对方法结果进行排序(将产生字母排序),然后显示结果。

package elevenObject;

import java.util.ArrayList;

import java.util.Collections;
import java.util.HashMap;

import java.util.List;
import java.util.Map;

public class TextExcFive {
public static void updataSta(Map<String, Integer> worldSta, String word) {
Integer num = worldSta.get(word);
worldSta.put(word, num == null ? 1 : num + 1);

}

public static void main(String[] args) {
List<String> world = new ArrayList<>();
Map<String, Integer> worldSta = new HashMap<String, Integer>();
//由于实在同篇文章都调用了TextFile()所以就没有再次copy。
for (String string : new TextFile().resource("word.txt", "\\W+")) {

updataSta(worldSta, string);

}
world.addAll(worldSta.keySet());
Collections.sort(world, String.CASE_INSENSITIVE_ORDER);
System.out.println(worldSta);
}

}


输出式样(读取word.txt内容为

think in java

in java

java):

{think=1, java=3, in=2}

总结:第一题如果是我做我会把文件内容切成char,这样符合题目要求,后来我参考书上例子,不仅把统计每一个元音字母出现的次数,还精确统计每个单词元音统计次数,还有就是代码写作风格比我要好太多。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: