Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用流而不是包含变量的循环?_Java - Fatal编程技术网

Java 如何使用流而不是包含变量的循环?

Java 如何使用流而不是包含变量的循环?,java,Java,我开发这段代码是为了检查由括号组成的字符串是否平衡。比如说, 不平衡:[“(“,”,“(“,”)”,“()(“,”,”,“,”,”,…]) 平衡:[“()”、“()”、“(())”、“(())()”、“(())()”、…] 我想使用流而不是for循环。循环中有一个条件语句,用于检查计数器变量何时小于零。我不清楚如何在流中包含此变量 我欢迎对此提供反馈。请参阅下面的代码: public String findBalance(String input) { String[] arr = in

我开发这段代码是为了检查由括号组成的字符串是否平衡。比如说,

不平衡:
[“(“,”,“(“,”)”,“()(“,”,”,“,”,”,…])

平衡:
[“()”、“()”、“(())”、“(())()”、“(())()”、…]

我想使用流而不是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";
}
publicsstringfindbalance(字符串输入){
字符串[]arr=input.split(“”);
整数计数器=0;
用于(字符串s:arr){
计数器+=s等于(“(”)1:-1;
如果(计数器<0)中断;
}
返回计数器==0?“已平衡”:“未平衡”;
}

提前感谢。

流式处理不太合适。问问自己,如果使用
parallelStream()
,会发生什么情况。如何处理简单的边缘情况

)(
您希望检测计数何时下降到0以下,即使它稍后会返回。使用并行流很难做到这一点。字符串最好按顺序处理


流操作在独立和无状态时工作得最好。有状态操作更适合于像您已经拥有的那样的常规
for
循环。

让我们看看流是否适合

  • 按字符顺序,维护嵌套堆栈时,需要一个计数器;减少是可行的。 然而,代码并没有更好,更详细,更慢 需要处理“…”(&“)…”。可能,但不好

  • 让我们看一个更并行的方法:递归/重复地替换内部可约表达式(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();
    }
    
  • 虽然拆分和征服并行在这里是可行的,但问题是像
    (())
    这样的事情需要重复

    对于流,人们可能会想到
    flatMap
    或诸如此类。但是流处理步骤不会重复(在当前java版本中),因此不容易实现

    因此,流解决方案并不合适

    可以将递归函数与拆分传递字符串的流相结合,
    使用并行流,但即使使用16个核和长度为1000的字符串,也不会快得多。

    不应使用流实现此功能。在Streams API中,一次只能访问一个元素。不应使用它引用该范围之外的内容。当然,这是可能的,但不建议使用est,你应该在使用for循环迭代字符串的同时使用堆栈进行平衡。流是不必要的。嘿,Joop!你在解释你的解决方案时做得非常好。你有一个有趣的方法来解决这个问题。非常感谢你。谢谢你John的评论。我正在学习Java,你做得非常好我们可以说,并行流并不是解决这个问题的最佳方法。