【问题标题】:Java For Loop Increment or Decrement Based on ConditionJava For循环根据条件递增或递减
【发布时间】:2025-12-04 16:15:02
【问题描述】:

除了循环索引方向外,我有两种相同的方法。

methodA 中的循环需要 indexBegin < indexEnd,因此它会将 i 从 indexBegin 递增到 indexEnd。

methodB 中的循环需要 indexBegin > indexEnd,因此它将 i 从 indexBegin 递减到 indexEnd。

public void methodA(int indexBegin, int indexEnd, List<Double> values) {
 for (int i = indexBegin; i <= indexEnd; i++) {
  ...
 }
}

public void methodB(int indexBegin, int indexEnd, List<Double> values) {
 for (int i = indexBegin; i >= indexEnd; i--) {
  ...
 }
}

有没有办法使用迭代器来整合这里的循环逻辑,所以我只有一个方法?我仍然需要跟踪索引。

【问题讨论】:

  • 只改变indexBegin和indexEnd的值以及增量值?

标签: java arraylist foreach iterator


【解决方案1】:

你可以像这样在for循环中使用三元运算符:

   public void method(int indexBegin, int indexEnd, List<Double> values) {
       int direction = indexEnd - indexBegin ;
       for (int i = indexBegin; direction > 0 ? i<=indexEnd : i>=indexEnd; i= direction>0 ? i+1:i-1) {
          ...
    }
  }

【讨论】:

    【解决方案2】:

    您可以选择索引,以便始终从下限迭代到上限。

    int begin = indexBegin > indexEnd ? indexEnd : indexBegin;
    int end = indexBegin > indexEnd ? indexBegin: indexEnd;
    
    for (int i = begin ; i <= end ; i++) {
      ...
    }
    

    【讨论】:

      【解决方案3】:

      在 java-8 中,您可以使用 IntStream.iterateStream.iteratelimit 的组合以递增或递减顺序生成序列,因此您可以通过传递 IntStream 作为参数来获得一种方法

      public void utilMethod(IntStream range, List<Double> values) {
         range.forEach(i->i);
       }
      

       public void utilMethod(Stream<Integer> range, List<Double> values) {
         range.forEach(i->i);
       }
      

      示例:

      IntStream.iterate(0,i->i+1).limit(10).forEach(System.out::println);
      
      IntStream.iterate(10,i->i-1).limit(10).forEach(System.out::println);
      

      从 java-9 中,您可以使用重载的 IntStream.iterateStream.iterate 以递增或递减顺序生成序列

      public void utilMethod(IntStream range, List<Double> values) {
         range.forEach(i->i);
       }
      

      示例

      IntStream.iterate(0, i->i<10, i->i+1).forEach(System.out::println);
      
      IntStream.iterate(10, i->i>0, i->i-1).forEach(System.out::println);
      

      【讨论】:

        【解决方案4】:

        您如何更改为一个while循环并声明两者?这样你就可以访问方法中的任何一个。

        int countingUp = indexBegin;
        int countingDown = indexEnd;
        
        while (countingUp < indexEnd) {
          . . .
        
          countingUp++;
          countingDown--;
        
        }
        

        【讨论】: