Java:在不使用循环的情况下将输入与列表中的所有内容进行比较?

Java: Comparing an input to everything in a list without using a loop?

这是一个 Hangman 游戏。 我正在使用 SortedSet 来存储用户输入的猜测。这些字母存储为 char。我想要做的是将给定单词中的每个字符与 SortedSet 中的每个字符进行比较,并将匹配的字符附加到 returned 字符串。如果不匹配,则会附加一个“-”。

例如:

我有一个包含猜测的集合:'a'、'e'、't'

我有一句话:苹果

方法应该return字符串"a---e"

现在,我有一种方法可以生成符合我需要的一个字符格式的字符串。我不确定如何修改它以便它适用于集合中的所有字符。

我不想 运行 集合中所有字符的整个 if/else 结构,因为那样会添加太多破折号,所以我认为我不能使用for-each 循环。

private int generatePattern(String s, char guess) {
    String pattern = "";
    for (int i = 0; i < length; i++){
        if (s.charAt(i) == guess){
            pattern += guess + " ";
        } else {
            pattern += "- ";
        }
    }
    return pattern;
}

首先,听起来您应该更改方法的 return 类型和参数 - 毕竟您需要 set 字母。并且 sets 有一个 contains 方法。所以我想你想要这样的东西:

public static String hideNonGuesses(String input, Set<Character> guesses) {
    char[] result = input.toCharArray();
    for (int i = 0; i < result.length; i++) {
        if (!guesses.contains(result[i])) {
            result[i] = '-';
        }
    }
    return new String(result);
}

或者换一种说法:

public static String hideNonGuesses(String input, Set<Character> guesses) {
    char[] result = new char[input.length()];
    for (int i = 0; i < result.length; i++) {
        char c = input.charAt(i);
        result[i] = guesses.contains(c) ? c : '-';
    }
    return new String(result);
}

(这也可以用 Java 8 个流来完成,但这可能同样简单。)

示例程序:

import java.util.*;

public class Test {

    public static void main(String[] args) throws Exception {
        Set<Character> guesses = new HashSet<>();
        System.out.println(hideNonGuesses("apple", guesses));
        guesses.add('p');
        System.out.println(hideNonGuesses("apple", guesses));
        guesses.add('o'); // No change - it's not in the word
        System.out.println(hideNonGuesses("apple", guesses));
        guesses.add('a');
        System.out.println(hideNonGuesses("apple", guesses));
    }

    public static String hideNonGuesses(String input, Set<Character> guesses) {
        char[] result = input.toCharArray();
        for (int i = 0; i < result.length; i++) {
            if (!guesses.contains(result[i])) {
                result[i] = '-';
            }
        }
        return new String(result);
    }

}

请注意,您仍在循环输入,Set.contains 中可能仍有循环(取决于实现),但它会得到您想要的结果...

你的问题在哪里?

在你的代码中,我认为它留下了一个循环,可能猜测应该是猜测字母的数组,你可以在你的第一个循环中迭代它。相反,您可以每次都用每个猜到的字母调用您的 generatePattern。