In my algorithm to compare the secret word with the guessed word, I need to manage the duplicated letters. For example,
if the secret word is newly and the guessed word is newer, the output of this should be "GGGWW" (G = green(Correct Place), W = White(The Letter isn't in the secret word)),
but instead my algorithm down below outputs "GGGYW" (Y = Yellow(Letter is in the word but not the right place)).

        for (int i = 0; i < 5; i++) {
            if (secret.charAt(i) == prop.charAt(i)) {
                status[i] = LetterStatus.IN;
            } else if (secret.contains(Character.toString(prop.charAt(i)))) {
                status[i] = LetterStatus.OK;
            } else {
                status[i] = LetterStatus.NOTIN;
            }
        }
        return status;

secret=secretword,数组状态是(IN, OK, NOTIN)的枚举,因此字母和props 状态是猜测的单词.

关于如何修改这个代码来解决我的问题有什么想法吗

推荐答案

你必须考虑到发生的次数.因此,首先处理精确匹配,记录到目前为止尚未找到的字母.对于猜测中的每一次出现,请从记录的字母中删除该字母,以便不再匹配它.例如.

ArrayList<Character> missing = new ArrayList<>();
for(int i = 0; i < 5; i++) {
    if(secret.charAt(i) == prop.charAt(i)) {
        status[i] = LetterStatus.IN;
    }
    else missing.add(secret.charAt(i));
}
if(!missing.isEmpty()) {
  for(int i = 0; i < 5; i++) {
      if(secret.charAt(i) != prop.charAt(i)) {
        Object ch = prop.charAt(i); // ensure to use remove(Object) not remove(int)
        status[i] = missing.remove(ch)? LetterStatus.OK: LetterStatus.NOTIN;
      }
  }
}

对于大数据,您可以使用Map<Character,Integer>之类的数字来记录每个元素的出现次数,但由于我们这里最多有五个元素,因此使用ArrayList在提供合理性能的同时更简单.重要的是要记住,这种方法不会扩展到其他问题.

Java相关问答推荐

如何更改已在数据库中注册的 id 列类型

按当前月份排序 List 到最近六个月

如何将 MySQL 查询结果放入 java 中的 List

@PutMapping MockHttpServletResponse 的 JUnit RestControllerTest 正文为空

如何计算 Arraylist 中的每个唯一项?

java JFileChooser如何临时禁用文件选择窗口

有没有更好的方法使用枚举来做到这一点?

为什么 Intellij 想法会在 if 条件下警告空指针?

如何为 JDK 17 编写 Github 工作流

将每个语句放在 Eclipse 中新行的 if 子句中

如何在Java中合并包含相同值的多个数组

从 List 到 List 的 Java 流

使用 wildfly 26 时无法使用 EJB Remote 读取响应

使用 JUnit 和 Mockito 编写单元测试

为什么 HttpServletRequest 的正文不能被多次读取?

Mockito,如何在方法中创建的对象上调用验证?

打印所有可以使用 `+` 或 `-` 运算符给出给定数字的组合

查找有向图中的所有循环,包括后边

用 String.join() 和 split() 方法替换字符串中的所有元音

Java 8 Streams 映射对象的浅拷贝,使用流交叉连接