【发布时间】:2020-10-26 21:32:35
【问题描述】:
所以这是对古老的石头、纸、剪刀 java 示例的一个稍微不同的看法。在这种情况下,用户输入输入(我假设它是有效的,即仅使用 R、P 和 S 的组合,并且有匹配的括号,也没有空格),例如 (R&S) 输出是 @ 987654322@ 因为 Rock 胜过 Scissors,或者 ((R&S)&(P&R)) 输出 P。
到目前为止,我的代码(如下)可以拆分字符串,遍历并将使用的字母放入列表中,因为我的想法只是从左到右阅读,评估直到我读到最后,但在这一点我很困惑,因为什么是跟踪所有“先前”结果的好方法。我需要另一个空列表吗?此外,使用案例似乎不可行,因为输入可能很长,而且 R、P 和 S 的完全随机组合。任何建议都值得赞赏!
import java.util.ArrayList;
import java.util.Scanner;
public class RPS {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
str = str.replaceAll("\\(", "").replaceAll("\\)","");
String inputs[] = str.split("&");
ArrayList<Object> list = new ArrayList<>();
for (int i = 0; i < inputs.length; i++){
if (inputs[i].substring(0, 1).contains("R")) {
list.add(inputs[i]);
} else if (inputs[i].substring(0, 1).contains("S")) {
list.add(inputs[i]);
} else if (inputs[i].substring(0, 1).contains("P")) {
list.add(inputs[i]);
}
}
for (int i = 0; i < list.size(); i++){
if (list.contains("R") && list.contains("S")){ //ex. if the input was "(R&S)"
System.out.println("R");
break;
}
}
}
}
【问题讨论】:
-
它的潜在复杂性和嵌套很大,我想知道您是否想要使用正式的词法分析器/解析器,例如 ANTLR4。
-
请考虑使用堆栈结构来解决这个问题。因此,您可以随时评估简单的操作并将结果放回堆栈以供进一步使用。
-
R&R会给什么? -
@btilly 哦,对了,那是 R,与 S&S、P&P 相同。 R,P,S的单个输入也只是它们自己