Educoder–Java高级特性(第三章)- Java 字符串与集合练习——词频统计【笔记+参考代码】

本文通过三关实战练习,深入讲解了Java中字符串处理与集合使用的技巧,包括使用String.split()和StringTokenizer类进行字符串分割,利用Map集合统计单词首次出现位置,以及读取文本并统计单词频率。
摘要由CSDN通过智能技术生成

Educoder–Java高级特性(第三章)- Java 字符串与集合练习——词频统计【笔记+参考代码】


第一关


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

用String.split()方法将字符串“aaa|bbb|ccc”以“|”进行拆分,用StringTokenizer类将字符串“This?is?a?test?string”以“?”进行拆分。
测试说明 补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。


测试输入:

aaa|bbb|ccc

This?is?a?test?string

预期输出:

aaa

bbb

ccc

This

is

a

test

string


提示:

“|”、“.”、“*”、“+”、“\”等不是有效的模式匹配规则表达式,是转义字符,使用split()方法时必须得加"\"才行。



参考代码

package step1;
import java.util.List;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class StudentDemo{

	//使用String.split()方法分割
	public List<String> splitPartition(String str){
		List<String> list=new ArrayList<String>();
					
		//请在此添加实现代码
		/********** Begin **********/
		String[] strArray=str.split("\\|");
		for(String str2:strArray){
			System.out.println(str2);
		}
		System.out.println();
		/********** End **********/
		return list;
	}

	//使用StringTokenizer类进行分割
	public List<String> tokenPartition(String str){
		List<String> list=new ArrayList<String>();
		//请在此添加实现代码
		/********** Begin **********/
		String[] strArray=str.split("\\?");
		for(String str1:strArray){
			System.out.println(str1);
		}
		/********** End **********/
		return list;
	}
}



第二关


编程要求
请仔细阅读右侧代码,根据方法内的提示,在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

这一关做得本人十分迷惑,不是很明白输出是按什么规则来的,而且在测试平台给出的参考答案也跟没有分割一样,过不了测评,在这里给平台的参考答案,如果有人过了这关欢迎在评论区交流一下,谢谢~

package step2;
import java.util.Map;
import java.util.HashMap;
import java.util.StringTokenizer;
public class StudentDemo{
	//返回一个Map集合来得到单词和首次出现的下标  key为单词名称  value为单词的角标
	public Map<String, Integer> getMap(String str){
		Map<String, Integer> map = new HashMap<String, Integer>();
		//对str进行分割   再加入map集合中
		//请在此添加实现代码
		/********** Begin **********/
		StringTokenizer tok = new StringTokenizer(str);
		String word;
		while(tok.hasMoreTokens()){
			word = tok.nextToken(",.\n");
			int index = str.indexOf(word);
			map.put(word,index);
		}
		/********** End **********/
		return map;
	}
}

在这里插入图片描述



第三关


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

将指定文本(可以通过右侧文件目录下的src/step3/readme.txt查看)以降序的方式输出每个单词出现的次数。
测试说明
补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。

预期输出:
you-16
to-10
have-6
want-5
the-5
who-5
and-5
of-5
a-4
those-4
make-4
go-4
enough-4
in-3
be-3
that-3
for-3
with-3
your-2
they-2
past-2
them-2
it-2
The-2
everything-2
one-2
people-2
do-2
only-2
hurts-2
their-2
life-2
just-2
on-2
what-2
don’t-1
happy-1
sorrow-1
heartaches-1
hope-1
kiss-1
when-1
put-1
Dream-1
begins-1
lifeuntil-1
tried-1
appreciate-1
pick-1
let-1
because-1
grows-1
based-1
lives-1
Always-1
If-1
much-1
hurt-1
strong-1
other-1
touched-1
May-1
probably-1
comes-1
tear-1
are-1
too-1
where-1
so-1
can’t-1
Happiness-1
failures-1
shoes-1
trials-1
future-1
sweet-1
happiest-1
feel-1
smile-1
There-1
things-1
forgotten-1
from-1
yourself-1
others-1
all-1
always-1
real-1
most-1
searched-1
dream-1
person-1
Love-1
keep-1
importance-1
dreams-1
best-1
necessarily-1
miss-1
can-1
moments-1
along-1
happiness-1
brightest-1
ends-1
lies-1
human-1
chance-1
will-1
cry-1
way-1
someone-1
well-1
hug-1

同样迷惑的一关,给出的答案好像没有用到升降序排序输出啊,但是却可以过测评???

package step3;
import java.util.Map;
import java.util.HashMap;
import java.util.StringTokenizer;
public class StudentDemo{
	//获取单词的数量
	public Map<String, Integer> getWordCount(String str) {
		Map<String, Integer> map = new HashMap<String, Integer>();
		
		//请在此添加实现代码
		/********** Begin **********/
		StringTokenizer tokenizer = new StringTokenizer(new String(str));
    	int count;
		String word;
		while (tokenizer.hasMoreTokens()) {
			word = tokenizer.nextToken(" ,?.!:;\"\"‘’\n");
			if (map.containsKey(word)) {
				count = map.get(word);
				map.put(word, count + 1);
			} else {
				map.put(word, 1);
			}
		}
		/********** End **********/
		return map;
	}
}

【笔记】entrySet的用法

public static void main(String[] args) {


  Map<String, String> map = new HashMap<String, String>();
  map.put("1", "value1");
  map.put("2", "value2");
  map.put("3", "value3");
  
  //第一种:普遍使用,二次取值
  System.out.println("通过Map.keySet遍历key和value:");
  for (String key : map.keySet()) {
   System.out.println("key= "+ key + " and value= " + map.get(key));
  }
  
  //第二种
  System.out.println("通过Map.entrySet使用iterator遍历key和value:");
  Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();
  while (it.hasNext()) {
   Map.Entry<String, String> entry = it.next();
   System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
  }
  
  //第三种:推荐,尤其是容量大时
  System.out.println("通过Map.entrySet遍历key和value");
  for (Map.Entry<String, String> entry : map.entrySet()) {
   System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
  }

  //第四种
  System.out.println("通过Map.values()遍历所有的value,但不能遍历key");
  for (String v : map.values()) {
   System.out.println("value= " + v);
  }
 }
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fuhanghang@yeah.net

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值