Java-使用其他'&'字符检查匹配的括号

时间:2018-09-11 16:56:58

标签: java hashmap stack matching parentheses

我编写了一个函数来检查括号是否平衡,即{([])}为真,{(})为false。但是我现在试图弄清楚如何说明一个与自身匹配的额外字符'&',即&{&&}&true,&{&} false。我尝试仅计算“&”的数量以查看是否为偶数,但这似乎行不通。有什么想法吗?

import pyspark.sql.functions as F
averages = df.groupBy("Class").agg(F.avg("Age").alias("avgAge"))
df_with_avgs = df.join(averages, on="Class")
imputed_df = df_with_avgs.withColumn("imputedAge", F.coalesce("Age", "avgAge"))

1 个答案:

答案 0 :(得分:2)

当您看到&,并且堆栈顶部是&时,请弹出它,否则推入&

要让您的代码处理此问题而无需特别对待&,只需交换代码以在stack之前检查map

代码的其他问题:

  • Stack类是旧类,建立在同步的Vector类之上。如javadoc所说,您应该改用Deque

  • 不要将您的陈述折叠得太多。将if控制的语句放在单独的行中,以提高人类可读性。

  • 请勿使用==(或!=)来比较对象,而应使用equals()

  • 您忘记在循环后检查堆栈是否为空,以确保没有悬挂的对。

public static boolean isBalanced(String input) {
    if (input == null)
        return false;
    int size = input.length();
    if (size % 2 == 1)
        return false;

    HashMap<Character, Character> map = new HashMap<>();
    map.put('(', ')');
    map.put('[', ']');
    map.put('{', '}');
    map.put('&', '&');

    Deque<Character> stack = new ArrayDeque<>();
    for (int i = 0; i < size; i++) {
        Character temp = input.charAt(i); // autobox here so it only happens once
        if (temp.equals(stack.peek())) // equals is false if stack is empty, since peek returns null
            stack.pop();
        else if (map.containsKey(temp))
            stack.push(map.get(temp));
        else
            return false;
    }

    return stack.isEmpty();
}

测试

System.out.println(isBalanced("{([])}"));
System.out.println(isBalanced("{(})"));
System.out.println(isBalanced("&{&&}&"));
System.out.println(isBalanced("&{&}"));
System.out.println(isBalanced("(("));

输出

true
false
true
false
false