Есть ли техника Java для решения дублирующих циклов в классе? - PullRequest
0 голосов
/ 06 ноября 2019

Я недавно отправил этот код как часть задачи по кодированию онлайн, и в качестве части моего отзыва мне сказали, что части моего кода могут быть улучшены, чтобы соответствовать «хорошей практике». Я попытался уменьшить количество строк, но мне не дали никаких подсказок, я все еще не уверен, как улучшить. Я надеюсь, что смогу получить некоторую помощь.

public class ArrayChecker {
  public boolean check(int[] expected, int[] actual, int maxValue, int delta) {
    // Clip 'too large' values
    for (int i = 0; i < actual.length; ++i) {
      if (actual[i] > maxValue) {
        actual[i] = maxValue;
      }
    }

    // Check for length differences
    if (actual.length != expected.length) {
      return false;
    }

    // Check that each entry is within the expected +/- delta
    for (int i = 0; i < actual.length; ++i) {
      if (Math.abs(expected[i] - actual[i]) > delta) {
        return false;
      }
    }

    return true;
  }
}

1 Ответ

1 голос
/ 07 ноября 2019

Я бы сначала проверил длины actual и expected. Затем я бы протестировал дельту и выполнил обрезку за один цикл и за один шаг (Math.min(int, int) может помочь). Например,

public boolean check(int[] expected, int[] actual, int maxValue, int delta) {
    if (actual.length != expected.length) {
        return false;
    }
    for (int i = 0; i < actual.length; ++i) {
        if (Math.abs(expected[i] - Math.min(maxValue, actual[i])) > delta) {
            return false;
        }
    }
    return true;
}

Если вы используете Java 8+, вы можете уменьшить его до лямбды.

public boolean check(int[] expected, int[] actual, int maxValue, int delta) {
    if (actual.length != expected.length) {
        return false;
    }
    return IntStream.range(0, actual.length)
            .noneMatch(i -> Math.abs(expected[i] - Math.min(maxValue, actual[i])) > delta);
 }

И, наконец, (сложный) возврат в одну строку, например

public boolean check(int[] expected, int[] actual, int maxValue, int delta) {
    return actual.length == expected.length && IntStream.range(0, actual.length)
            .noneMatch(i -> Math.abs(expected[i] - Math.min(maxValue, actual[i])) > delta);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...