我知道有人问过类似的问题。我已经通读了它们并开发了我认为合理解决问题的方法。但是,当我运行代码时,它不会像我认为的那样执行。我显然在这里遗漏了一些东西。
我需要读取一个字符串(一个命题逻辑语句)并确定它有多少变量。我的思考过程是:将字符串转换为charArray
并比较元素。如果某个元素是字母AND不等于数组中的另一个元素,则它是一个新变量,因此添加到变量count中,并且还需要存储在单独的数组中供以后使用。
public class PropLogic {
public static void main(String[] args) {
Scanner stdin = new Scanner(System.in);
String statement;
int numOfVariables = 0;
System.out.println("Enter your propositional statement:");
statement = stdin.nextLine();
char[] charStatement = statement.toCharArray();
char[] variables;
variables = new char[25];
// Counts number of variables in statement
for (int i = 0; i < statement.length(); i++){
for(int j = i + 1; j < statement.length(); j++){
if(Character.isLetter(charStatement[i]) && (charStatement[i] !=
charStatement[j])){
variables[i] = charStatement[i];
numOfVariables++;
}
}
}
System.out.println("The number of variables is " + numOfVariables);
System.out.println("The variables are " + new String(variables));
}}
输入&#34;你好&#34;我得到9个变量的输出,变量是&#34; hell&#34;当我想获得4个变量时,&#34;你好&#34;。
答案 0 :(得分:1)
为什么不使用Set
。集合具有只能在其中输入一次相同对象的属性。这是一个版本:
Set<Character> set = new LinkedHashSet<>();
for(int i = 0; i< statement.length(); i++) {
set.add(statement.charAt(i));
}
System.out.println("The number of variables is " + set.size());
System.out.println("The variables are ");
set.forEach(System.out::println);
答案 1 :(得分:0)
我看到两个问题:
问题1。想想会发生什么,例如,用“你好”的“h”。您依次将它与“e”,“l”,“l”和“o”以及每个的进行比较,然后添加一个新变量。你想要的是只有当所有未来的字母都不等于“h”时才添加一个新变量。这就是为什么你总共得到9个变量:你为以下每个比较添加一个:
(h, e), (h, l), (h, l), (h, o)
(e, l), (e, l), (e, o)
(l, o)
(l, o)
这也是你将“地狱”作为最终变量数组的原因。 o
永远不会与任何东西进行比较,因此永远不会被添加到数组中。
你真正想要做的是遍历整个字符串的其余部分,并检查是否有任何内容等于当前字母。您可以使用布尔标志执行此操作。这是伪代码:
for i = 0 to len(charArray):
isNewVariable = isLetter(charArray[i])
for j = i+1 to len(charArray):
if charArray[i] == charArray[j]:
isNewVariable = false
if isNewVariable:
Add charArray[i] to variables
问题2。您正在填写变量数组的错误索引。您想要填写variables[numOfVariables]
,而不是variables[i]
。假设第一个和第七个字母是变量;那么您希望将variables[0]
和variables[1]
设置为两个变量, not variables[0]
和variables[6]
,这是您当前的代码所做的。
希望这有帮助!如果您修复了这两个错误,您的代码将会起作用;然而,正如其他答案所指出的那样,这种一般性策略并不是这项具体任务的最佳策略。增量添加到数组(如variables
)最好使用ArrayList
;更好的是,Set
完全适合于只查找数组的唯一元素。
答案 2 :(得分:0)
您不需要使用char数组,因为String包含方法CharAt()
和contains()
。
然后你必须运行你的String。当你找到一个新的字母(这个字母不在已经找到的数组中)时,你将它放在已经找到的数组中,然后递增你的计数器。 (注意,计数器是无用的,因为它与已经找到的数组的长度相同)。你应该得到这样的东西:
String statement = stdin.nextLine();
String variables = ""; //empty String
//Go through the whole String statement
for (int i = 0; i < statement.length(); i++){
//Check if this letter was not already found and it's a letter
if(!variables.contains(statement.charAt(i)) && Character.isLetter(statement.charAt(i)) ){
//Add this letter to the found ones
variables.concat(String.valueOf(statement.charAt(i)));
}
}
System.out.println("The number of variables is " + variables.length());
System.out.println("The variables are " + variables);
答案 3 :(得分:0)
这里发生的事情是,检查char是否存在于'temp.indexOf(char)'
的临时字符串中,如果它存在于该字符串的索引处则返回1,否则返回0。
所以如果为0,则添加并循环到下一个char。
public static void main( String[] args ){
Scanner stdin = new Scanner(System.in);
String statement;
int numOfVariables = 0;
System.out.println("Enter your propositional statement:");
statement = stdin.nextLine();
char[] charStatement = statement.toCharArray();
char[] variables;
variables = new char[25];
String temp = "";
for (int i = 0; i < statement.length(); i++){
char current = statement.charAt(i);
if (temp.indexOf(current) < 0){
temp = temp + current;
}
}
System.out.println("The number of variables is " + temp.length());
System.out.println("The variables are " + temp);
}
答案 4 :(得分:0)
如果您没有坚持使用char[]
变量并使用List<Character>
,那么就可以了,这就完成了工作
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class PropLogic {
public static List<Character> parseVariables(char[] input) {
List<Character> candidates = new ArrayList<>();
for (int i = 0; i < input.length; i++){
Character c = input[i];
if( Character.isLetter(c) && !candidates.contains(c)) {
candidates.add(c);
}
}
return candidates;
}
public static void main(String[] args) {
Scanner stdin = new Scanner(System.in);
System.out.println("Enter your propositional statement:");
char[] charStatement = stdin.nextLine().toCharArray();
List<Character> variables = parseVariables(charStatement);
System.out.println("The number of variables is " + variables.size());
System.out.println("The variables are " + variables);
}
}
示例输出:
Enter your propositional statement:
hello1
The number of variables is 4
The variables are [h, e, l, o]
答案 5 :(得分:0)
成功编写优秀程序的关键是确保它具有尽可能少的代码行,并且不会重复已执行或甚至不需要的操作。
如果您考虑问题陈述,基本上,您需要做的就是从给定的输入字符串中提取字母并删除重复项。使用像Java这样的高级编程语言,String操作不应该超过几行代码。如果它超过2行,在大多数情况下,它有很多锅炉板代码。
查看以下代码行是否符合您的目标。
Set<String> variables = Arrays.stream(statement.split("")).filter(str -> Character.isLetter(str.charAt(0))).collect(Collectors.toSet());
答案 6 :(得分:0)
这是一个单行:
String[] variables = statement.replaceAll("[^a-z]|(.)(?=.*\\1)", "").split("(?<=.)");
这使用正则表达式删除(通过替换为空白)所有非小写字母或稍后重复的所有字母(即删除欺骗)。
然后它会在每个字母后分割,从输入中为您提供最终的唯一字母数组。
请注意,这会创建一个String[]
而不是char[]
,您可以轻松使用它。如果你真的想要char[]
,你可以这样做:
String[] variables = statement.replaceAll("[^a-z]", "").chars()
.distinct().mapToObject(c -> (char)c).toArray();