java 如何使用函数接口(也许)将比较操作符传递给while循环?

9vw9lbht  于 2023-02-20  发布在  Java
关注(0)|答案(2)|浏览(101)

我有两个几乎相同的方法,唯一的区别是一个从数组中的点“左”,第二个从数组中的点“右”。有什么方法可以消除这两个方法的重复吗?也许可以使用函数接口和函数?

void goLeft(int number, int index, int increment, int to) {
  int localMax = 0;
  int i = index;
  while (i > to) {
    i += increment; // passed increment is negative
    // common body
  }
}

void goRight(int number, int index, int increment, int to) {
  int localMax = 0;
  int i = index;
  while (i < to) {
    i += increment; // passed increment is positive
    // common body
  }
}
bq3bfh9z

bq3bfh9z1#

如果唯一的区别是while循环的条件,则可以使用三元运算符:

while (increment < 0 ? i > to : i < to) {
    i += increment; 
    // common body
}
8gsdolmq

8gsdolmq2#

我想我使用枚举做了类似的事情,在您的情况下可能是这样的:

public class Example {
  void go(Direction direction, int number, int index, int to) {
    while (LEFT == direction ? i > to : i < to) {
      i = direction.increment(i);
      // ...
      i = direction.decrement(i);
      // ...
      i = direction.floor(i, to);
      // ...
      var fromIndex = direction.fromIndex(index);
    }
  }
}

public enum Direction {
  LEFT(" <- left") {
    @Override
    int increment(int value) {
      return --value;
    }

    @Override
    int decrement(int value) {
      return ++value;
    }

    @Override
    int floor(int value, int limit) {
      return Math.max(value, limit);
    }

    @Override
    int fromIndex(int value) {
      return value;
    }
  },
  
  RIGHT(" right ->") {
    @Override
    int increment(int value) {
      return ++value;
    }

    @Override
    int decrement(int value) {
      return --value;
    }

    @Override
    int floor(int value, int limit) {
      return Math.min(value, limit);
    }

    @Override
    int fromIndex(int value) {
      return value + 1;
    }
  },
  ;

  final String sign;

  Direction(String sign) {
    this.sign = sign;
  }

  abstract int increment(int value);

  abstract int decrement(int value);

  abstract int floor(int value, int limit);

  abstract int fromIndex(int value);

  @Override
  public String toString() {
    return sign;
  }
}

相关问题