我目前正在研究一个简单的代码,它将检查用户输入的字符串是否包含for循环中指定的字符。
我当前的代码
import java.util.Scanner;
public class AutumnLeaves {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int G = 0;
int R = 0;
int Y = 0;
int B = 0;
String S = sc.nextLine();
for (int i = 0; i < S.length(); i++) {
if (S.contains("G")) {
G++;
} else {
if (S.contains("R")) {
R++;
} else {
if (S.contains("Y")) {
Y++;
} else {
if (S.contains("B")) {
B++;
}
}
}
}
}
int total = G + R + Y + B;
System.out.println(G/total);
System.out.println(R/total);
System.out.println(Y/total);
System.out.println(B/total);
}
}
如您所见,它检查字符串是否包含此类字符,并将字符的计数器增加一。但是,当我运行它时,我没有收到我预测的结果。 如果我输入GGRY,它输出1 0 0 0.当所需输出为
时 0.5
0.25
0.25
0.0
任何帮助将不胜感激!
答案 0 :(得分:6)
问题是如果整个字符串包含给定字符,S.contains
将返回true。 S.charAt
应该可以解决您的问题:
for (int i = 0; i < S.length(); i++) {
if (S.charAt(i) == 'G') G++;
else if (S.charAt(i) == 'R') R++;
else if (S.charAt(i) == 'Y') Y++;
else if (S.charAt(i) == 'B') B++;
}
此外,除以整数将返回一个整数(向下舍入)。因此,除非所有字符都相同,否则您的输出将始终为0
。在打印前将它们转换为double
:
System.out.println((double) G/total);
System.out.println((double) R/total);
System.out.println((double) Y/total);
System.out.println((double) B/total);
编辑:正如Sumit Gulati在评论中指出的那样,switch语句在Java 7中会有更好的表现。另外,正如David Conrad指出在if
循环中只使用for
s会因为条件是互相排斥的。
答案 1 :(得分:1)
您之前的代码S.contains("some character")
正在查找整个字符串中字符的索引。使用S.charAt(i)
专门查找字符串中i
位置的索引。
最后,您需要将整数转换为浮点,以便将输出打印为浮点值。
public class AutumnLeaves {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int G = 0;
int R = 0;
int Y = 0;
int B = 0;
String S = sc.nextLine();
for (int i = 0; i < S.length(); i++) {
if (S.charAt(i) == 'G') {
G++;
} else {
if (S.charAt(i) == 'R') {
R++;
} else {
if (S.charAt(i) == 'Y') {
Y++;
} else {
if (S.charAt(i) == 'B') {
B++;
}
}
}
}
}
int total = G + R + Y + B;
System.out.println(G * 1.0 / total);
System.out.println(R * 1.0 / total);
System.out.println(Y * 1.0 / total);
System.out.println(B * 1.0 / total);
}
}