【问题标题】:Check string contains attribute from array list检查字符串是否包含数组列表中的属性
【发布时间】:2013-12-15 21:17:48
【问题描述】:

嘿,我正在用 Java 编写一个计算器脚本。 我目前正试图找出一种方法来查找字符串中的任何字符是否在 ArrayList 中。

例如: 我必须将输入作为字符串我将此字符串传递给一个方法,该方法可以访问其中包含运算符和操作数的数组列表。如何确保字符串只包含此数组列表中的操作数和运算符?

谢谢,夏兰

这是我目前输入的代码。

import java.util.*;
public class stringCalculator {

private String[] operators = {"+","-","/","*"};

public stringCalculator(String userinput){

    System.out.println(userinput);

    public boolean checkInput(){

    }

}

}

这是新代码。

import java.util.*;
public class stringCalculator {

private String userinput;
HashSet<String> op = new HashSet<String>();

public stringCalculator(String userinput){
    this.userinput = userinput;
    //System.out.println(userinput);
    HashSet<String> op = new HashSet<String>();
    op.add("+");
    op.add("-");
    op.add("*");
    op.add("/");
    this.op = op;

    System.out.println(op);
}
public void checkTheInput(){
    System.out.println(userinput);
}

public boolean checkInput(){
    return op.contains(userinput);

}



}

【问题讨论】:

    标签: java arrays string arraylist


    【解决方案1】:

    根据 cmets 进行了编辑以满足要求

    如果字符串仅包含 -+/* 或数字,则返回 true:

    public boolean checkInput(String input) {
        return input.matches("[-+/*0-9]+");
    }
    

    这使用正则表达式来断言字符串仅包含指定的字符。正则表达式的细分:

    • [...] 是一个字符类,它列出了允许的字符
    • + 表示“一个或多个前面的表达式”(在本例中为字符类)

    请注意,字符类中的减号适用于范围字符,例如0-9 表示0123456789。但是,当字符类中的第一个或最后一个使用减号时,它表示 literal 减号(不是范围)。

    关于String.matches() 的另一个注意事项 - 它必须与 整个 字符串匹配才能返回 true。这与许多其他语言不同,如果字符串的 part 匹配,类似的方法/函数将返回 true。

    【讨论】:

    • 这只是检查字符串是否在数组列表中。我更想看看字符串的任何单个元素是否在列表中?
    • 您的意思是要检查字符串是否包含+-/* 中的任何字符?
    • 除 +-/* 以外的任何内容?
    • 为了清楚起见,如果字符串包含除+-/*以外的任何字符,您希望返回true?
    • 如果它只包含 +-/* 和 0-9,我希望它返回 true,如果包含其他任何内容,则返回 false。所以 3+2-3 为真,但 as+2f 为假
    【解决方案2】:

    所以,你想取出数字,然后检查剩余的字符是否都包含在opereators 中。假设您的输入字符串不是太长,我建议您使用HashSet 而不是 String[] 来表示operators。这样,您可以使用 [contains(Object)][1] 方法(将是 O(1) 而不是 O(n))处理字符串中不是数字的任何内容。

    然而,随着验证的进行,您仍然需要检查更多内容,例如:“4++5/-3”,其中操作数有效,但整体表达式无效。

    【讨论】:

    • 我打算创建另一个数组列表,称为操作数,其中包含所有要检查的数字。
    • 没关系,用HashSet就行了。你看,检查 ArrayList 中是否有东西意味着你必须按顺序遍历每个元素,如果 n 是运算符的数量,这需要与 n 成正比的时间。但是,如果您改用 HashSet,则无论运算符的数量如何,检查都更接近于恒定时间(所谓的 O(1))
    • 我将新代码放在我的问题中。这有效,但前提是运算符是字符串中唯一的东西。我只是想编写这个方法来确保 String 除了运算符和操作数之外不包含任何内容。一旦它工作,我将在 HashSet 中添加 0-9。
    【解决方案3】:

    如果要计算表达式如:

    (3+4)*5

    (INFIX 格式)。直接读取字符串不是很明智。您应该首先将输入转换为 POSTFIX 或 Reverse Polish 格式,例如:

    34+5*

    这可以通过一个一个地读取字符并使用堆栈来完成。在这种情况下,您可以在 Set 或 Map 中一个一个地存储运算符来动态检查字符。

    我建议您查看 http://en.wikipedia.org/wiki/Reverse_Polish_notation 的 POSTFIX 格式和 http://www.softwareandfinance.com/Java/Infix_Postfix_Converter.html 例如转换代码。

    【讨论】:

    • 谢谢,是的,我将转换为 RPN,但是目前我只想要一种方法来检查用户是否输入了任何不是运算符或操作数的字符。
    • 所以在这种情况下,一次扫描所有字符是没有意义的。在转换为 RPN 时,您将一一获得字符。然后你可以检查它们是合法的还是非法的。
    • 作为我工作的一部分,这很容易,但我需要先制定一个检查方法!不过谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 2020-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多