如何比较数组中的元素并将特定元素存储到单独的数组中?

时间:2018-03-23 16:02:27

标签: java arrays

我知道有人问过类似的问题。我已经通读了它们并开发了我认为合理解决问题的方法。但是,当我运行代码时,它不会像我认为的那样执行。我显然在这里遗漏了一些东西。

我需要读取一个字符串(一个命题逻辑语句)并确定它有多少变量。我的思考过程是:将字符串转换为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;。

7 个答案:

答案 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();