头歌Educoder——Java 字符串与集合练习—词频统计(二)

简介: Java 字符串与集合练习

第2关:确定单词在字符串中的位置

任务描述

本关任务:得到一个单词在一段字符串中的位置。

相关知识

为了完成本关任务,你需要掌握:如何获取字符串中指定单词出现的下标

String.indexOf(String str)

返回指定子字符串在此字符串中第一次出现处的索引。(若返回-1则表示在该字符串中没有你要找的单词)

//声明一段字符串Stringstr="Can I help you";
//显示“I”在str中第一次出现的下标System.out.println(str.indexOf("I"));
//String.indexOf(int ch)方法与此方法形同,只是参数是单个字符的ASCII码

输出:4

String.indexOf(String str, int fromIndex)

返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始。

Stringstr="Can I help you";
System.out.println(str.indexOf("I",5));
//同样String.indexOf(int ch, int fromIndex)方法与此方法也形同,只是参数是单个字符的ASCII码

输出:-1

编程要求

请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,具体任务如下:

  • 列出给定字符串中每个单词(按“ ”“,”“?”“.”“!”“:”“\n”分割)首次出现的位置。

测试说明

补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。

测试输入:

No arguments will give courage to the coward.

预期输出:

单词:the---首次出现的角标34

单词:No---首次出现的角标0

单词:give---首次出现的角标18

单词:will---首次出现的角标13

单词:arguments---首次出现的角标3

单词:to---首次出现的角标31

单词:coward---首次出现的角标38

单词:courage---首次出现的角标23

提示:

//1.分割单词时可一次进行//2.可以采用Map集合的键值对存储Map<String, Integer>map=newHashMap<String, Integer>();
map.put("Hello",0);
map.put("world",1);
Set<Entry<String, Integer>>entrySet=wordCount.entrySet();
for (Entry<String, Integer>entry : entrySet) {
System.out.println(entry.getKey()+"---"+entry.getValue());
}

输出:

Hello---0

world---1


开始你的任务吧,祝你成功!

代码示例

test.java

packagestep2;
importjava.util.Scanner;
importjava.util.Map;
importjava.util.HashMap;
importjava.util.Set;
importjava.util.Map.Entry;
publicclasstest{
publicstaticvoidmain(String[] args){
StudentDemodemo=newStudentDemo();
Scannersc=newScanner(System.in);
Stringnext=sc.nextLine();
Map<String, Integer>map=demo.getMap(next);
Set<Entry<String, Integer>>entrySet=map.entrySet();
for (Entry<String, Integer>entry : entrySet) {
System.out.println("单词:"+entry.getKey()+"---首次出现的角标"+entry.getValue());
        }
    }
}

StudentDemo.java

packagestep2;
importjava.util.Map;
importjava.util.HashMap;
importjava.util.StringTokenizer;
publicclassStudentDemo {
// 返回一个Map集合来得到单词和首次出现的下标 key为单词名称 value为单词的角标publicMap<String, Integer>getMap(Stringstr) {
Map<String, Integer>map=newHashMap<String, Integer>();
// 对str进行分割 再加入map集合中// 请在此添加实现代码/********** Begin **********/StringTokenizerstn=newStringTokenizer(str, " ,?.!:\n");
while (stn.hasMoreTokens()) {
Stringstr1=stn.nextToken();
map.put(str1, str.indexOf(str1));
        }
/********** End **********/returnmap;
    }
}

第3关:实现词频统计和排序输出

任务描述

本关任务:编写一个能计算一段文本内容中出现单词的次数的降序排列的小程序。

相关知识

为了完成本关任务,你需要掌握:

1.如何统计相同单词的次数;

2.如何进行排序。

统计相同单词的次数

//使用map集合进行存储Strings="Day by Day";
Map<String,Integer>map=newHashMap<String,Integer>();
StringTokenizertokenizer=newStringTokenizer(s);
intcount;//记录次数Stringword;//单个单词while(tokenizer.hasMoreTokens()){
word=tokenizer.nextToken(" ");
if(map.containsKey(word)){
//拿到之前存在map集合中该单词的次数count=map.get(word);
map.put(word, count+1);
    }else{
map.put(word, 1);
    }
}
Set<Entry<String, Integer>>entrySet=map.entrySet();
for (Entry<String, Integer>entry : entrySet) {
System.out.println(entry.getKey()+"-"+entry.getValue());
}

输出:

by-1

Day-2

如何进行排序

使用Collections包装类。它包含有各种有关集合操作的静态多态方法。

//可根据指定比较器产生的顺序对指定列表进行排序。Collections.sort(List<T>list, Comparator<?superT>c)

示例如下:

//以上实例中的map集合为例   将map集合的每一项添加进list集合中List<Map.Entry<String, Integer>>infos=newArrayList<Map.Entry<String, Integer>>(map.entrySet());
Collections.sort(infos, newComparator<Map.Entry<String, Integer>>() {
publicintcompare(Map.Entry<String, Integer>o1,
Map.Entry<String, Integer>o2) {
//前者-后者  升序         后者-前者  降序return (o2.getValue() -o1.getValue());
    }
});

输出:

Day-2

by-1

编程要求

请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,具体任务如下:

  • 将指定文本(可以通过右侧文件目录下的src/step3/readme.txt查看)以降序的方式输出每个单词出现的次数。

测试说明

补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。

预期输出: 参考右边测试集中的输出。


开始你的任务吧,祝你成功!

代码示例

StudentDemo.java

packagestep3;
importjava.util.Map;
importjava.util.HashMap;
importjava.util.StringTokenizer;
publicclassStudentDemo {
// 获取单词的数量publicMap<String, Integer>getWordCount(Stringstr) {
Map<String, Integer>map=newHashMap<String, Integer>();
//请在此添加实现代码/********** Begin **********/StringTokenizerstn=newStringTokenizer(str, " ;’,?.!:\n");
while (stn.hasMoreTokens()) {
Stringstr1=stn.nextToken();
if (map.containsKey(str1)) {
map.put(str1, map.get(str1) +1);
            } else {
map.put(str1, 1);
            }
        }
/********** End **********/returnmap;
    }
}

test.java

packagestep3;
importjava.io.BufferedReader;
importjava.io.FileReader;
importjava.util.List;
importjava.io.IOException;
importjava.util.ArrayList;
importjava.util.Collections;
importjava.util.Comparator;
importjava.util.Map;
importjava.util.Map.Entry;
publicclasstest{
publicstaticvoidmain(String[] args) throwsIOException {
StudentDemodemo=newStudentDemo();
BufferedReaderbuffer=newBufferedReader(newFileReader("src/step3/readme.txt"));
Stringstr="",s="";
while((str=buffer.readLine())!=null){
s+=str;
        }
Map<String, Integer>wordCount=demo.getWordCount(s);
List<Entry<String, Integer>>sortWordCount=sortWordCount(wordCount);
for (Entry<String, Integer>entry : sortWordCount) {
System.out.println(entry.getKey()+"-"+entry.getValue());
        }
    }
//对单词出现的次数进行排序publicstaticList<Entry<String, Integer>>sortWordCount(Map<String, Integer>map) {
List<Map.Entry<String, Integer>>infos=newArrayList<Map.Entry<String, Integer>>(map.entrySet());
Collections.sort(infos, newComparator<Map.Entry<String,Integer>>() {
@Overridepublicintcompare(Entry<String, Integer>o1,
Entry<String, Integer>o2) {
return (o2.getValue() -o1.getValue());
            }
        });
returninfos;
    }
}

readme.txt

There are moments in life when you miss someone so much that you just want to pick them from your dreams and hug them for real! Dream what you want to dream;go where you want to go;be what you want to be,because you have only one life and one chance to do all the things you want to do.May you have enough happiness to make you sweet,enough trials to make you strong,enough sorrow to keep you human,enough hope to make you happy? Always put yourself in others’shoes.If you feel that it hurts you,it probably hurts the other person, too.The happiest of people don’t necessarily have the best of everything;they just make the most of everything that comes along their way.Happiness lies for those who cry,those who hurt, those who have searched,and those who have tried,for only they can appreciate the importance of people who have touched their lives.Love begins with a smile,grows with a kiss and ends with a tear.The brightest future will always be based on a forgotten past, you can’t go on well in lifeuntil you let go of your past failures and heartaches.
目录
相关文章
|
26天前
|
存储 安全 Java
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
42 3
|
3月前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
56 3
|
3月前
|
存储 Java 数据处理
Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位
【10月更文挑战第16天】Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位。本文通过快速去重和高效查找两个案例,展示了Set如何简化数据处理流程,提升代码效率。使用HashSet可轻松实现数据去重,而contains方法则提供了快速查找的功能,彰显了Set在处理大量数据时的优势。
48 2
|
2月前
|
SQL Java 索引
java小工具util系列2:字符串工具
java小工具util系列2:字符串工具
159 83
|
2月前
|
存储 安全 Java
Java零基础-字符串详解
【10月更文挑战第18天】Java零基础教学篇,手把手实践教学!
120 60
|
2月前
|
Java 数据库
java小工具util系列1:日期和字符串转换工具
java小工具util系列1:日期和字符串转换工具
70 26
|
1月前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
49 5
|
2月前
|
存储 缓存 安全
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
59 4
|
2月前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
83 8
|
2月前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
63 6