现有数据 : 刘备字玄德 诸葛亮字孔明 曹操字孟德 孙权字仲谋 关羽字云长 张飞字翼德 赵云字子龙 乐进字文谦 李典字曼成 曹仁字子孝 曹洪字子廉 需求 : 使用Stream流完成 , 把名字收集到map集合中作为键,字号作为map集合的值
时间: 2024-06-10 18:08:10 浏览: 126
好的,这是一个Java编程问题。根据您提供的数据,代码应该如下:
Map<String, String> map = Stream.of("刘备字玄德", "诸葛亮字孔明", "曹操字孟德", "孙权字仲谋", "关羽字云长", "张飞字翼德", "赵云字子龙", "乐进字文谦", "李典字曼成", "曹仁字子孝", "曹洪字子廉")
.collect(Collectors.toMap(str -> str.substring(0, str.indexOf("字")), str -> str.substring(str.indexOf("字")+1)));
这样就完成了题目要求,将名字收集到map集合中作为键,字号作为map集合的值。
相关问题
利用HashMap键-值对结构,将人名做key,对应的次数为value,统计三国演义中, 指定人名:“诸葛亮(或孔明)、曹操(或孟德、丞相)、刘备(或玄德)、关羽(或关公)、张飞”出现的次数,并按次数排倒序输出。文件“三国演义. txt”
首先,我们需要读取文件中的文本内容,并对其中的人名进行计数。下面是一个实现的示例代码:
```java
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class CountNames {
public static void main(String[] args) {
String fileName = "三国演义.txt";
String[] names = {"诸葛亮", "孔明", "曹操", "孟德", "丞相", "刘备", "玄德", "关羽", "关公", "张飞"};
Map<String, Integer> counts = new HashMap<>();
// 读取文件并统计人名出现次数
try (BufferedReader br = new BufferedReader(new FileReader(fileName))) {
String line;
while ((line = br.readLine()) != null) {
for (String name : names) {
if (line.contains(name)) {
counts.put(name, counts.getOrDefault(name, 0) + 1);
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
// 按次数排倒序输出
counts.entrySet().stream()
.sorted(Map.Entry.<String, Integer>comparingByValue().reversed())
.forEach(entry -> System.out.println(entry.getKey() + ": " + entry.getValue()));
}
}
```
在上面的代码中,我们首先定义了要统计的人名数组,以及一个HashMap来存储每个人名出现的次数。然后,我们利用Java的IO库读取文件内容,并逐行查找是否包含人名。如果包含,则将该人名对应的计数器加一。最后,我们按照计数器的大小倒序输出每个人名的出现次数。
需要注意的是,这里使用了Java 8中的Stream API来对HashMap中的键值对进行排序和输出。如果不熟悉这些API,可以参考Java官方文档或其他相关教程。
import jieba def get_txt(): txt = open(r"E:\TXT\threekingdoms.txt", "r", encoding="utf-8").read() return txt three_txt = get_txt() three_txt = jieba.lcut(three_txt) # print(three_txt) counts = {} for word in three_txt: if len(word) <= 1: continue if word == "诸葛亮" or word == "孔明曰": rword = "孔明" elif word == "关公" or word == "云长": rword = "关羽" elif word == "玄德" or word == "玄德曰": rword = "刘备" elif word == "孟德" or word == "丞相": rword = "曹操" elif word == "周瑜" or word == "都督": rword = "周瑜" else: rword = word counts[rword] = counts.get(rword, 0) + 1 # 统计词频并在字典中创建键值对 # print(counts) items = list(counts.items()) # 将无序的字典类型转换为可排序的列表类型 items.sort(key=lambda x: x[1], reverse=True) # 以元素的第二列进行从大到小排序 # print(items) for i in range(10): word, count = items[i] print("{:<5}:{:>5}".format(word, count)) # 格式化输出排序结果
这段代码首先通过导入`jieba`模块来分词。然后定义了一个函数`get_txt()`,该函数用于打开指定路径下的一个以`utf-8`编码的文本文件,并将文件内容读入到一个变量`txt`中,最后将`txt`变量返回。接着,调用该函数将文本文件中的内容读取并存储到变量`three_txt`中。最后,用`jieba.lcut()`方法对`three_txt`进行分词处理,并将处理结果再次存储到`three_txt`变量中。
阅读全文