Поиск всех индексов, которые содержат максимальное значение - PullRequest
0 голосов
/ 13 октября 2018

У меня есть список списков на Java.Предполагается получить последний элемент каждого списка и поместить его в другой список с именем lastItems, затем он получит максимальное значение lastItems и его индекс.Вот код:

List<List<Integer>> myList = new ArrayList<>();
myList.add(new ArrayList<Integer>());
myList.add(new ArrayList<Integer>());
myList.add(new ArrayList<Integer>());

myList.get(0).add(1);
myList.get(0).add(2);
myList.get(0).add(3);
myList.get(1).add(4);
myList.get(1).add(5);
myList.get(1).add(6);
myList.get(2).add(7);
myList.get(2).add(8);
myList.get(2).add(9); 
if (!myList.contains(Collections.EMPTY_LIST) && !myList.contains(null) && myList.stream().allMatch(l -> l.size() == L.get(0).size())) {             
     int[] lastItems = myList.stream().mapToInt(x -> x.get(x.size() - 1)).toArray();
     int maxValue = Arrays.stream(lastItems).max().getAsInt();
     int index = IntStream.range(0, lastItems.length).filter(i -> maxValue == lastItems[i]).findFirst().orElse(-1));
     System.out.println(maxValue);
}

, но проблема в том, что IntStream.range(0, lastItems.length).filter(i -> maxValue == lastItems[i]).findFirst().orElse(-1)) находит в списке только индекс первого maxValue, но я хочу найти все индексы, которые могут содержать maxValue(например, в list = [9, 5, 9], index = 0 и index = 2 содержат maxValue).Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

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

int[] maxIndices = IntStream.range(0, lastItems.length)
    .filter(i -> lastItems[i] == maxValue)
    .toArray();

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

Если вы просто хотите напечатать это, то это будет,

IntStream.range(0, lastItems.length)
.filter(i -> lastItems[i] == maxValue)
.forEach(System.out::println);
0 голосов
/ 13 октября 2018

Почему бы просто не сделать это просто?Найдя maxValue, используйте простой цикл for, чтобы узнать индекс самых больших значений.

int[] lastItems = myList.stream().mapToInt(x -> x.get(x.size() - 1)).toArray();
int maxValue = Arrays.stream(lastItems).max().getAsInt();

for (int i = 0; i < lastItems.length; i++) {
    if (maxValue == lastItems[i])
        System.out.println("MAx value = " + lastItems[i] + " with index " + i);
}
...