【问题标题】:Java StringTokenizer considering parenthesesJava StringTokenizer 考虑括号
【发布时间】:2013-09-25 15:08:41
【问题描述】:

我正在创建一个对布尔逻辑表达式进行标记并返回标记字符串数组的程序。以下是我的代码:

public static String[] tokenize(String s)
{
    String delims = "+";
    StringTokenizer st = new StringTokenizer(s, delims);
    String[] tokens = new String[st.countTokens()];

    int i=0;
    while (st.hasMoreElements()) {
        tokens[i++] = st.nextElement().toString();
    }

    return tokens;
}

例如,我有以下字符串作为输入:

A+B+(C+D+(A+B))+(B+C)

使用我拥有的代码,它只会生成以下标记:

A
B
(C
D
(A
B))
(B
C)

是否有可能(使用相同的代码结构)提出这些标记?如果不是,它是如何编码的?

A
B
(C+D+(A+B))
(B+C)

【问题讨论】:

  • 您可以一次循环遍历 1 个字符,当您到达 + 而不是括号时,将读取的字符保存到那里,然后开始一个新的集合。跟踪您是否在一组括号中的方法是使用计数器。当您点击一个左括号时,您将计数器加 1,当您点击右括号时,您将计数器减 1。如果计数器 > 0,那么您在括号中。哦,如果 counter 为负数,则字符串无效,如果 counter 最后不为 0,则字符串也是无效的。

标签: java stringtokenizer


【解决方案1】:
    ArrayList<String> tokens = new ArrayList<String>();
    String current = "";
    int counter = 0;
    for(int i = 0 ; i < input.length(); i++)
    {
        char c = input.charAt(i);
        if(counter==0 && c=='+')
        {
            tokens.add(current);
            current = "";
            continue;
        }
        else if(c=='(')
        {
            counter++;
        }
        else if(c==')')
        {
            counter--;
        }
        current += c;
    }
    tokens.add(current);

这是我评论的解决方案:

当您到达 + 时,您可以一次循环遍历 1 个字符 虽然不在括号中,但将读取的字符保存到那里,并且 开始一个新的集合。跟踪您是否在一组括号中的方法 是带柜台的。当你点击一个左括号时,你增加一个 计数器减 1,当你点击右括号时,你会减少 计数器加 1。如果计数器 > 0,那么你在括号中。哦,还有 如果 counter 变为负数,则字符串无效,如果 counter 结尾不为0,则该字符串也是无效的。

您可以对 counter 进行检查并返回 false 或其他内容,以表明它是无效字符串。如果您知道该字符串是有效的,那么这将按原样工作。你可以从 ArrayList 中获取一个数组,使用tokens.toArray()

【讨论】:

  • 哇,这就像一个魅力!我不太确定初始 if 的条件语句。谢谢你的澄清!
【解决方案2】:

如果你能找到一个简单的解决方案,那就试试我的

    String s = "A+B+(C+D+(A+B))+(B+C)";
    List<String> l = new ArrayList<>();
    StringBuilder sb = new StringBuilder();
    int p = 0;
    for (char c : s.toCharArray()) {
        if (c == '(') {
            p++;
            sb.append(c);
        } else if (c == ')') {
            p--;
            sb.append(c);
        } else if (p == 0 && c == '+') {
            l.add(sb.toString());
            sb.setLength(0);
        } else {
            sb.append(c);
        }
    }
    if (sb.length() > 0) {
        l.add(sb.toString());
    }
    System.out.println(l);

输出

[A, B, (C+D+(A+B))]

【讨论】:

    猜你喜欢
    • 2021-01-19
    • 2016-04-12
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多