Java实现双词字符比对游戏出现类型转换报错问题求解
Java字符比对小游戏逻辑修复方案
报错直接原因
incompatible types: char cannot be converted to java.lang.CharSequence 来自两处API用法错误:
String.contains()方法要求传入CharSequence类型参数(即字符串类序列),直接传入char类型的数组元素会触发类型不匹配isUsed.contains(i)逻辑完全错误:该方法作用是判断参数代表的字符序列是否存在于字符串中,传入int类型的索引i既不符合参数类型要求,也实现不了“判断字符是否已被匹配占用”的需求
原代码另外还有3个逻辑漏洞:
- 用字符串拼接存储已匹配字符,无法处理目标词含重复字符的场景(比如目标词是
AAB,猜测词是AAA时,第三个A不能判定为存在,因为目标词仅含2个A) - PRESENT分支中向
isUsed拼接的是索引i的数字转字符(比如i=1会拼接字符'1'),和实际匹配的字符无关,逻辑完全失效 - 没有做输入长度校验,两个输入词长度不一致时会触发数组越界
正确实现思路
- 放弃用字符串存储已使用字符,改用长度26的int数组(对应大写A-Z共26个字母)统计目标词中未被位置正确匹配的字符剩余数量
- 分两轮遍历:第一轮先标记所有位置完全匹配的CORRECT结果,未匹配的目标字符计入计数数组;第二轮再处理非正确位,如果对应字符剩余计数大于0则判定为PRESENT,同时扣减对应计数,否则判定为ABSENT
- 单char转字符串用
String.valueOf(c),避免类型转换错误
可直接运行的修正代码
import java.io.BufferedReader; import java.io.InputStreamReader; public class Quiz { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String s = br.readLine().trim().toUpperCase(); String q = br.readLine().trim().toUpperCase(); if (s.length() != q.length()) { System.out.println("输入的两个单词长度必须一致"); return; } char[] sArray = s.toCharArray(); char[] qArray = q.toCharArray(); // 索引0对应A,1对应B...25对应Z,存储每个字符剩余可匹配次数 int[] charLeftCount = new int[26]; String[] result = new String[s.length()]; // 第一轮:标记所有位置正确的匹配项 for (int i = 0; i < s.length(); i++) { if (qArray[i] == sArray[i]) { result[i] = "CORRECT " + qArray[i]; } else { // 未被位置匹配的字符计入剩余计数 charLeftCount[sArray[i] - 'A']++; } } // 第二轮:处理位置错误、不存在的情况 for (int i = 0; i < q.length(); i++) { if (result[i] != null) { continue; } int charIndex = qArray[i] - 'A'; if (charLeftCount[charIndex] > 0) { result[i] = "PRESENT " + qArray[i]; charLeftCount[charIndex]--; } else { result[i] = "ABSENT " + qArray[i]; } } // 逐行输出结果 for (String line : result) { System.out.println(line); } } }
效果验证
输入目标词APPLE、猜测词PAPER时,输出如下,完全符合规则:
PRESENT P CORRECT A PRESENT P CORRECT E ABSENT R
内容的提问来源于stack exchange,提问作者acar
相关产品推荐
相关产品推荐

