Как найти все вхождения с наибольшим числом в списке? - PullRequest
5 голосов
/ 12 апреля 2020

В основном, если у меня есть ArrayList<Integer>, содержащий <0, 1, 5, 5, 4, 2>, мне нужно создать отдельное ArrayList из <2, 3> для индексов.

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

Я изначально думал:

int highest = 0;

for (int b = 0; b < arrlst.size(); b++) {
    int p = arrlst.get(b);

    if (highest <= p) {
        highest = p;
        highestindex.add(b);
    }
}

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

Затем я подумал о том, чтобы поместить highestindex.add(...) часть вне l oop, но затем это добавит только последний индекс, а не все.

Ответы [ 4 ]

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

Я бы go для добавления и очистки ArrayList<Integer>:

public ArrayList<Integer> getIndexesOfHighestNum(List<Integer> list) {
    ArrayList<Integer> indexes = new ArrayList<Integer>();
    int highest = Integer.MIN_VALUE;

    for (int i = 0; i < list.size(); i++) {
        int value = list.get(i);

        if (value > highest) {
            indexes.clear();
            indexes.add(i);
            highest = value;
        } else if (value == highest)
            indexes.add(i);
    }

    return indexes;
}
3 голосов
/ 12 апреля 2020

Вы можете сделать это с потоком как,

int max = intArr.stream().reduce(Integer::max).get();
IntStream.range(0, intArr.size()).boxed()
        .filter(i -> max == intArr.get(i))
        .collect(Collectors.toList());
0 голосов
/ 12 апреля 2020

Чтобы упростить код, мы можем использовать Collections#max, чтобы получить максимальное значение.
Чтобы улучшить express наше намерение (индекс фильтра с максимальным значением), мы можем использовать IntStream вместо a для l oop.

public static List<Integer> getMultipleMaxIndex(final List<Integer> from) {
    if (from.isEmpty()) {
        return Collections.emptyList();
    }
    final Integer max = Collections.max(from);
    IntStream indexes = IntStream.range(0, from.size() - 1);
    return indexes.filter(index -> from.get(index).equals(max)).boxed().collect(Collectors.toList());
}
0 голосов
/ 12 апреля 2020

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

private static List<Integer> getMaxIndices(int[] list){
        int max = list[0];
        for(int i = 1; i < list.length; i++)
            if(max < list[i])
                max = list[i];
        List<Integer> res = new ArrayList<>();
        for(int i = 0; i < list.length; i++)
            if(list[i] == max)
                res.add(i);
        return res;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...