if(!countMap.containsKey(tail)) { countMap.put(tail, 0); }什么意思
时间: 2024-02-14 16:32:56 浏览: 130
这段代码是用于计算成语接龙游戏中每个成语出现的次数,具体来说,这段代码实现了以下操作:
1. 检查当前成语的末尾字是否已经存在于`countMap`中,如果不存在,则创建一个新的键值对,其中键是当前成语的末尾字,值是0。
2. 如果当前成语的末尾字已经存在于`countMap`中,则不需要做任何操作。
简单来说,这段代码就是在构建一个以成语的末尾字为键值的Map,每个键对应一个整数值,表示该末尾字出现的次数。在游戏中,每次给出一个成语后,就可以通过检查该成语的末尾字是否在`countMap`中,来更新该末尾字在游戏中出现的次数。
相关问题
if (!idiomMap.containsKey(tail)) { idiomMap.put(tail, new ArrayList<String>()); } idiomMap.get(tail).add(idiom);什么意思
这段代码是用于构建成语接龙游戏中的词库,其作用是将每个成语的末尾字与下一个成语的开头字对应起来,以此来构成一张成语连续图谱。具体来说,这段代码实现了以下操作:
1. 检查以当前成语的末尾字为键值是否已经存在于`idiomMap`中,如果不存在,则创建一个新的键值对,其中键是以当前成语的末尾字,值是一个空的字符串列表。
2. 将当前成语添加到以当前成语的末尾字为键值的字符串列表中。
简单来说,这段代码就是在构建一个以成语的末尾字为键值的Map,每个键对应一个字符串列表,列表中包含所有以该键值为开头字的成语。这样,在游戏中,每次给出一个成语后,就可以通过查找以该成语的末尾字为键值的字符串列表,找到下一个可以接龙的成语。
public class IdiomProcessor { public static void main(String[] args) { try { FileReader fr = new FileReader("D:\yy\java\成语接龙\成语大全\去重后.txt"); BufferedReader br = new BufferedReader(fr); String line; HashMap<Character, ArrayList<String>> idiomMap = new HashMap<>(); while ((line = br.readLine()) != null) { String[] parts = line.trim().split("拼音:"); String idiom = parts[0]; //String info = parts[1]; if(!idiom.isEmpty()) { char tail = idiom.charAt(idiom.length() - 1); if (!idiomMap.containsKey(tail)) { idiomMap.put(tail, new ArrayList<String>()); } idiomMap.get(tail).add(idiom);} } br.close(); fr.close(); ArrayList<String> result = new ArrayList<>(); FileReader fr2 = new FileReader("D:\yy\java\成语接龙\成语大全\去重后.txt"); BufferedReader br2 = new BufferedReader(fr2); while ((line = br2.readLine()) != null) { String[] parts = line.trim().split("拼音:"); String idiom = parts[0]; //String info = parts[1]; if(!idiom.isEmpty()) { char tail = idiom.charAt(idiom.length() - 1); int count = idiomMap.get(tail).size() - 1; result.add(line.trim() + "可接:" + count); } } br2.close(); fr2.close(); FileWriter fw = new FileWriter("D:\yy\java\成语接龙\成语大全\全量成语处理后.txt"); BufferedWriter bw = new BufferedWriter(fw); for (String line2 : result) { bw.write(line2); bw.newLine(); } bw.close(); fw.close(); } catch (IOException e) { e.printStackTrace(); } } }请修改这个代码,改变count都相等的情况
可以尝试修改第二个while循环中的计算count的方式,具体方法如下:
1. 在第一个while循环中,使用另外一个HashMap来记录每个成语的尾字母出现的次数,键为成语的尾字母,值为对应的出现次数。
2. 在第二个while循环中,对于每个成语,先根据尾字母查找对应的成语列表,然后遍历该列表,统计其中可以接上该成语的个数。具体方法是,对于列表中的每个成语,将其尾字母作为键,查找对应的出现次数,将该出现次数作为可接个数。然后将所有可接个数相加,作为该成语的count值。
修改后的代码如下:
```java
public class IdiomProcessor {
public static void main(String[] args) {
try {
FileReader fr = new FileReader("D:\yy\java\成语接龙\成语大全\去重后.txt");
BufferedReader br = new BufferedReader(fr);
String line;
HashMap<Character, ArrayList<String>> idiomMap = new HashMap<>();
HashMap<Character, Integer> countMap = new HashMap<>(); // 新增计数Map
while ((line = br.readLine()) != null) {
String[] parts = line.trim().split("拼音:");
String idiom = parts[0];
if(!idiom.isEmpty()) {
char tail = idiom.charAt(idiom.length() - 1);
if (!idiomMap.containsKey(tail)) {
idiomMap.put(tail, new ArrayList<String>());
}
idiomMap.get(tail).add(idiom);
if(!countMap.containsKey(tail)) {
countMap.put(tail, 0);
}
countMap.put(tail, countMap.get(tail) + 1); // 尾字母计数加1
}
}
br.close();
fr.close();
ArrayList<String> result = new ArrayList<>();
FileReader fr2 = new FileReader("D:\yy\java\成语接龙\成语大全\去重后.txt");
BufferedReader br2 = new BufferedReader(fr2);
while ((line = br2.readLine()) != null) {
String[] parts = line.trim().split("拼音:");
String idiom = parts[0];
if(!idiom.isEmpty()) {
char tail = idiom.charAt(idiom.length() - 1);
ArrayList<String> idiomList = idiomMap.get(tail);
int count = 0;
for(String s : idiomList) {
if(s.equals(idiom)) continue; // 自己不能接自己
char first = s.charAt(0);
if(first == tail) {
count += countMap.get(first);
}
}
result.add(line.trim() + " 可接:" + count);
}
}
br2.close();
fr2.close();
FileWriter fw = new FileWriter("D:\yy\java\成语接龙\成语大全\全量成语处理后.txt");
BufferedWriter bw = new BufferedWriter(fw);
for (String line2 : result) {
bw.write(line2);
bw.newLine();
}
bw.close();
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
阅读全文