因此,对于一个课程,我需要制作一个程序,根据字母的拼字游戏值对单词进行评分。因此,aa
应为2
,因为1 a
值1分。但出于某种原因,我的节目只显示了1分。
import java.util.Scanner;
public class Scrabble {
public static void main(String[] args) {
String[] alphabet = {"a", "b", "c", "d", "e",
"f", "g", "h", "i",
"j", "k", "l", "m", "n", "o",
"p", "q", "r", "s", "t", "u", "v",
"w", "x", "y", "z"};
int[] values = {1, 3, 3, 2, 1, 4,
2, 4, 1, 8, 5, 1, 3, 1, 1, 3, 10,
1, 1, 1, 1, 4, 4, 8, 4, 10};
Scanner kboard = new Scanner(System.in);
System.out.println("Input your word.");
String choice = kboard.nextLine();
int score = 0;
for(int i = 0; i < choice.length(); i++) {
for(int n = 0; n < 26; n++) {
if(choice.substring(i).equals(alphabet[n]))
{
score += values[n];
}
}
}
System.out.println("The score for your word is " + score);
}
}
答案 0 :(得分:3)
问题是someStr.substring(i)
不会只返回一个字母。例如,System.out.println("aaa".substring(1));
的输出为"aa"
,不是 a
。
以下是修改后的版本:
char[] alphabet = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
int[] values = {1, 3, 3, 2, 1, 4, 2, 4, 1, 8, 5, 1, 3, 1, 1, 3, 10, 1, 1, 1, 1, 4, 4, 8, 4, 10};
Scanner kboard = new Scanner(System.in); System.out.println("Input your word.");
String choice = kboard.nextLine();
int score = 0;
for(int i = 0; i < choice.length(); i++) {
for(int n = 0; n < 26; n++) {
// Use charAt here instead of substring
if(choice.charAt(i) == alphabet[n])
{
score += values[n];
}
}
}
System.out.println("The score for your word is " + score);
}
更好的是,您可以使用哈希表作为字母表并避免内循环。
答案 1 :(得分:0)
因为&#34; aa&#34; .substring(0)==&#34; aa&#34;哪个!=&#34; a&#34;。所以基本上这是一个昂贵的“最后一个字母”。
使用choice.charAt(index)代替。 (另外,你可以给我们一个char来映射查找以跳过迭代每个char)
答案 2 :(得分:0)
您使用了错误的子字符串版本,我假设您要使用substring(int beginIndex, int endIndex)
此版本的子字符串应该允许您只选择一个字符子字符串来与您的字母数组进行比较。但是,当使用substring(int beginIndex)时,子字符串以指定索引处的字符开头并延伸到此字符串的末尾,这意味着您要选择多于一个字符子字符串(除非你在alphabet.length-1
)。
或者解决手头的问题,只需将if
条件更改为:
if(Character.toString(choice.charAt(i)).equals(alphabet[n]))
答案 3 :(得分:0)
试试这个解决方案:
import java.util.Scanner;
public class Scrabble {
public static void main(String[] args) {
String[] alphabet = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"};
int[] values = {1, 3, 3, 2, 1, 4, 2, 4, 1, 8, 5, 1, 3, 1, 1, 3, 10, 1, 1, 1, 1, 4, 4, 8, 4, 10};
Scanner kboard = new Scanner(System.in);
System.out.println("Input your word.");
String choice = kboard.nextLine();
int score = 0;
for(int i = 0; i < choice.length(); i++) {
for(int n = 0; n < 26; n++) {
if(choice.substring(i, i + 1).equals(alphabet[n])) {
score += values[n];
}
}
}
System.out.println("The score for your word is " + score);
}
}
基本上,您没有正确使用substring() 。您只输入了一个开始索引,这意味着它从该点读取直到字符串结束。我将其更改为读取结束索引,在您的情况下为i+1
。
基本上在你第一次迭代中你在alphabet
中寻找“aa”而且只在你的第二次迭代中你只在alphabet
中寻找“a”,这就是为什么你没有得到你在第一次迭代中的第一个'1点'。