Извлечение информации из коллекции - читаемость или производительность? - PullRequest
1 голос
/ 12 апреля 2020

Иногда из коллекции требуется извлечь некоторую информацию.

Но как лучше всего это сделать?

Удобочитаемость> Производительность

Если коллекция должна быть повторена для какой-либо отдельной информации, то у нас будет n-временных циклов, которые влияют на производительность. С другой стороны, подходы просты для понимания, поскольку легко понять, какая информация извлекается из коллекции.

Простой пример:

int max = determineMax(new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7)));
int sum = calculateSum(new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7)));
...
private int determineMax(ArrayList<Integer> integers) {
    int max = 0;
    for (Integer oneInteger : integers) {
        max = Math.max(max, oneInteger);
    }
    return max;
}
private int calculateSum(ArrayList<Integer> integers) {
    int sum = 0;
    for (Integer oneInteger : integers) {
        sum += oneInteger;
    }
    return sum;
}

Производительность> Читаемость

Другое решение - l oop один раз, но затем необходимо вернуть много переменных. Для этого подхода нам нужно использовать массив или создать искусственный класс для возвращаемых значений.

Простой пример:

int[] extractedInformation = extractInformation(new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7)));
...
private int[] extractInformation(ArrayList<Integer> integers) {
    int sum = 0;
    int max = 0;
    for (Integer oneInteger : integers) {
        sum += oneInteger;
        max = Math.max(max, oneInteger);
    }
    return new int[]{sum, max};
}

Ответы [ 2 ]

4 голосов
/ 12 апреля 2020

Вы можете стремиться к производительности, но в реальном мире, где проекты настолько велики, и вы не просто человек, работающий над этим.

Я бы сказал, что удобочитаемость и удобство обслуживания должны иметь преимущество перед производительностью, пример, который вы привели, не следует за инкапсуляцией.

Рекомендуется, чтобы один метод выполнял только одно и имя метода должно отражать одну вещь

Иногда вы можете не следовать ей и go за производительность, но только в тех случаях, когда производительность заметна.

И вы, как правило, только получить заметную разницу только тогда, когда сложность времени отличается некоторой степенью, такой как O (n), O (n 2 )

, хотя второй, кажется, работает быстрее, действительно, но оба они все еще называются линейными, потому что O (n) + O (n) не составляет 2 * O (n)

В коротких компьютерах в наши дни слишком быстро, вы не должны отказываться от читаемости и удобства обслуживания для незначительное повышение производительности.

И ваш пример - крайний случай, в большинстве случаев вы не встретите такого рода вещи, подумайте, нужна ли вам только сумма, или можете только max, вы будете определять еще два метода, в противном случае вы получите две вещи, когда попросите один, и это тоже не очень хорошо для производительности.

Это также зависит от того, что вы собираетесь делать большую часть раз

3 голосов
/ 20 апреля 2020

Я согласен с Абхинавом Чауханом.

Кроме того, если эти методы извлечения информации встречаются часто, может оказаться целесообразным написать класс для этого варианта использования. Он мог бы обработать эту информацию при добавлении / удалении в содержащую коллекцию во время выполнения или обработке данной коллекции.

Если ваш пример был менее общим и действительно содержал числа, существуют классы c statisti, которые покрывают сумму , max, среднее значение, стандартное отклонение et c.

...