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。
这是一个 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。