Изменение порядка элементов в потоке Java - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть поток объектов, и я хотел бы реализовать правило, которое гарантирует, что первый элемент в потоке не соответствует определенным критериям (например, не является нечетным числом).Я не хочу просто отбрасывать эти предметы, я просто хочу убедиться, что они не первые в списке.

Как реализовать что-то подобное в потоке Java?

Ответы [ 2 ]

0 голосов
/ 23 сентября 2019

не уверен, что это отличное решение.но он делает то, что вы хотите.things - это список, а getNum() - функция, которую вы хотите увидеть, если она четная.

things.add(0,things.remove(things.indexOf(things.stream().filter(t->t.getNum()%2==0).findFirst().orElse(things.get(0)))));

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

0 голосов
/ 23 сентября 2019

Вы можете использовать компаратор для сортировки элементов вашего потока.Также вы можете создать компаратор с несколькими правилами, вызвав метод firstComparator.thenComparing(secondComparator).Смотрите пример.Для ввода у нас есть номера: [2, 3, 4, 5, 7, 8, 9, 10].Для вывода у нас будет: [2, 4, 8, 10, 3, 9, 5, 7].Сначала мы ставим четные числа.Затем мы ставим числа, делимые на три.А потом мы ставим другие цифры.

public static void main(String[] args) {
    List<Integer> sourceList = new ArrayList<>(Arrays.asList(2, 3, 4, 5, 7, 8, 9, 10));

    Comparator<Integer> firstComparator = new Comparator<Integer>() {
        @Override
        public int compare(Integer o1, Integer o2) {
            if (o1 % 2 == 0 && o2 % 2 == 0 || o1 % 2 != 0 && o2 % 2 != 0) {
                return 0;
            }
            if (o1 % 2 == 0) {
                return -1;
            }
            return 1;
        }
    };

    Comparator<Integer> secondComparator = new Comparator<Integer>() {
        @Override
        public int compare(Integer o1, Integer o2) {
            if (o1 % 3 == 0 && o2 % 3 == 0 || o1 % 3 != 0 && o2 % 3 != 0) {
                return 0;
            }
            if (o1 % 3 == 0) {
                return -1;
            }
            return 1;
        }
    };

    List<Integer> sortedList = sourceList
            .stream()
            .sorted(firstComparator.thenComparing(secondComparator)
            .collect(Collectors.toList());

    System.out.println(sortedList);
}
...