我创建了一段代码,检查一组括号中的字符串是否平衡。例如,
测试1.输入:()())(
,输出:“不平衡”。
测试2.输入:()
,输出:“平衡”
我想使用流而不是for循环。循环中有一个变量,用于检查一个条件,并在需要时中断“计数器”。我不知道如何以流格式包含此变量。
谢谢您的帮助。
public String findBalance(String input) {
String[] arr = input.split("");
Integer counter = 0;
for (String s : arr) {
counter += s.equals("(") ? 1 : -1;
if (counter < 0) break;
}
return counter == 0 ? "Balanced" : "Not Balanced";
}
答案 0 :(得分:1)
流式传输不适合。问自己,如果使用parallelStream()
会发生什么。您将如何处理一个简单的边缘情况?
)(
您希望检测计数何时下降到0以下,即使稍后返回。使用并行流很难做到这一点。最好按顺序处理该字符串。
流操作独立且无状态时效果最佳。有状态的操作更适合常规的for
循环,就像您已经拥有的一样。
答案 1 :(得分:0)
让我们看看Stream是否适合。
依次,按字符顺序,保持一个<嵌套>嵌套栈,则需要一个计数器。 减少是可行的。 但是,代码并不是更好,更冗长,更慢。利用并行 将需要处理“ ...(”&“)...”。可能但不好。
让我们看一看更多的 parallel 方法:递归/重复地替换内部可约化表达式(redex ()
)
public String findBalance(String input) {
String s = input.replaceAll("[^()]", "");
for (;;) {
String t = s.replace("()", "");
if (t.length() == s.length()) {
break;
}
s = t;
}
return s.isEmpty();
}
尽管在这里分而治之并行性是可行的,但问题是(())
之类的东西需要重复。
对于Stream,人们可能会想到flatMap
之类的东西。但是,流处理步骤不会重复(在当前的Java版本中),因此不容易实现。
因此,Stream解决方案不合适。
可以将递归函数与Stream结合使用,以分割传递的字符串, 使用并行Stream,但是即使使用16个内核和长度为1000的字符串也不会很快。