当前位置: 首页 > 知识库问答 >
问题:

在Java 8中使用嵌套for循环

刘修能
2023-03-14

我在下面的代码中使用了嵌套的for循环,并且我有一些条件来中断内部的for循环,这提高了代码的性能。

public static int getMaxValue(List<Integer> list) {
    int result = -1;
    for(int i=0; i<list.size(); i++) {
        for(int j=i+1; j<list.size(); j++) {
            if(list.get(j) - list.get(i) <= 0) break;
            if(list.get(j) - list.get(i) > result) {
                result = list.get(j) - list.get(i);
            }
        }
    }
    return result;
}

现在,如何使用 Java 8 流来执行相同的逻辑?我想出了下面的代码:

public static int getMaxValue(List<Integer> list) {
    int[] result = { -1 };
    IntStream.range(0, list.size()).forEach(i -> {
        IntStream.range(i + 1, list.size()).forEach(j -> {
            if(list.get(j) - list.get(i) <= 0) return;

            if(list.get(j) - list.get(i) > result[0]) {
                result[0] = list.get(j) - list.get(i);
            }
        });
    });
    return result[0];
}

在这里,我不能在java流中使用< code>break语句,所以我使用了< code>return语句,但它仍然运行内部循环,因为它不会中断内部循环,所以性能没有提高。

共有3个答案

杜思远
2023-03-14

如果你的目的是找到最大值,你可以这样做:

list.stream()
     .mapToInt(Integer::intValue)
     .max();

它将返回一个OptionalInt,它将为空,您的列表为空。

否则,不确定您想用代码实现什么。。。

操作部门澄清后更新。

创建一个名为< code>MinMax的小类,它存储< code>min和< code>max,如下所示:

public class MinMax {
  private final int min;
  private final int max;

  private MinMax(int min, int max) {
    this.min = min;
    this.max = max;
  }

  public int getDifference() {
    return this.max - this.min;
  }

  public MinMax accept(int element) {
    int newMin = element < min ? element : min;
    int newMax = element > max ? element : max;

    if (newMin != min || newMax != max) {
      return new MinMax(newMin, newMax);
    } else {
      return this;
    }
  }

  public static MinMax seed() {
    return new MinMax(Integer.MAX_VALUE, Integer.MIN_VALUE);
  }
}

这个新类负责跟踪最小值和最大值。现在您可以这样做:

int result = list.stream() 
                 .reduce(MinMax.seed(), MinMax::accept())
                 .getDifference();
东方建修
2023-03-14

Java 流为此用例提供了一个特殊的功能,即 findfirst,它将停止对集合的迭代并立即返回。查看此 https://www.google.ae/amp/s/www.geeksforgeeks.org/stream-findfirst-java-examples/amp/

此外,您可以使用filter来应用您的测试条件,您将使用filter来检查和findFirst来停止。一般来说,这是按照你的要求去做。

融唯
2023-03-14

如果我理解你的代码,你试图找到输入列表中任意两个元素之间的最大成对差异。您可以使用< code > IntSummaryStatistics 来实现这一点:

public static int getMaxValue(List<Integer> list) {
    IntSummaryStatistics stats = list.stream()
        .mapToInt(Integer::intValue)
        .summaryStatistics();
    return stats.getMax() - stats.getMin();
}

这是一个O(n)运算,辅助存储为O(1)。仍然不需要O(n)运算。最终,尽早跳出循环是一种优化,但不是非常有效的优化——找到一种渐近成本更低的方法总是比只是尽早跳出循环更有效。

 类似资料:
  • 我有下面的代码,我使用嵌套的循环,我有一些条件,打破了内部的循环,这提高了这段代码的性能。 假设提供的列表已排序。现在我想找到元素的数量,它们的差值等于某个值,比如说。 现在使用相同的逻辑Java8个流,这里为了跳过内部循环我已经使用了语句,但是由于内部循环没有被破坏,性能没有提高。

  • 和其他编程语言一样, Java 允许循环嵌套。如果把一个循环放在另一个循环体内,那么就可以形成嵌套循环。 嵌套循环既可以是 for循环嵌套 while 循环,也可以是 while 循环嵌套 do-while 循环 …… 即各种类型的循环都可以作为外层循环,也可以作为内层循环。 当程序遇到嵌套循环时,如果外层循环的循环条件允许,则开始执行外层循环的循环体,而内层循环将被外层循环的循环体来执行——只是

  • 在学习Java 8 streams和lambas时,我尝试用streams替换以下嵌套for循环: 循环迭代“ProvidedService”对象的列表,对于每个对象,循环遍历“Desk”对象的列表属性,并将“Id”字段提取到列表中。 我使用streams生成了以下代码: 这是正确/最佳的方法吗?或者有没有一种方法可以在没有第二个嵌套流的情况下实现这一点?

  • 问题内容: 我正在尝试使用嵌套的for循环显示一个星号菱形。 到目前为止,这是我的代码: 这很接近,但是我要两次打印9个星号。 如何调整第二个for循环以7个星号和2个空格开始输出? 谢谢您的帮助! 问题答案: 在您的第一个for循环中,删除=标记,然后使用<例如 完整代码

  • 我正在迭代两个不同大小的列表: 我要做的是:遍历这两个列表并从array1中挑出所有元素,为此我可以在array2中找到一个元素,该元素与array1中的元素相加产生一定的和。 有没有人知道我怎么用流来处理这个案子?

  • 我有一个嵌套的for循环,但是它会减慢一点处理速度,我如何才能使嵌套循环高效。我需要的是对于外循环的每个值,内循环继续其所有迭代。但是,我不认为它会像两个嵌套循环那样影响计算。我的第二个问题是,循环会影响速度还是会支持我的现象? 我的代码: