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

本文详细介绍了使用Java编程语言对文本文件中的元音字母进行统计及单词计数的方法,并通过实例展示了如何高效处理文本数据。文章不仅涵盖了基本的字符串操作和数据结构应用,还强调了代码的可扩展性和效率优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这篇文章的练习题在面试题中经常考到,关于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,这样符合题目要求,后来我参考书上例子,不仅把统计每一个元音字母出现的次数,还精确统计每个单词元音统计次数,还有就是代码写作风格比我要好太多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值