Сортировка значений массивов объектов и печать нескольких из них в одной лямбде - PullRequest
0 голосов
/ 19 декабря 2018

Моя цель - распечатать два значения из четырех - имя (строка) и цвет волос (перечисление) - которые описывают определенный объект в массиве.Проблема заключается в сортировке печатного списка по алфавиту по имени.Все это должно быть в одной лямбде.

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

public void printAllNamesColours() {
        people.stream()
            .forEach(n->System.out.println(n.getName() + " " + n.getColour()));
    }

@Override
public int compareTo(Person person) {
        int ret = name.compareToIgnoreCase(person.name);
        if (ret == 0) {
            ret = colour.compareTo(person.colour);
        }
        if (ret == 0) {
            ret = age - person.age;
        }
        return ret;
    }

Ответы [ 4 ]

0 голосов
/ 20 декабря 2018

listPersonVO.stream (). Sorted ((o1, o2) -> o1.getName (). Trim (). CompareTo (o2.getName (). Trim ())). Collect (Collectors.toList ());

введите описание изображения здесь

0 голосов
/ 19 декабря 2018

Поскольку ваши Person объекты Comparable, вы можете напрямую вызвать метод sorted и распечатать результат.

people.stream()
      .sorted()
      .forEachOrdered(n->System.out.println(n.getName() + " " + n.getColour()));

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


Вы также можете решить отсортировать только мое имя или только по цвету, не изменяя текущую реализацию compareTo, и в этом случае вы можете использоватьпользовательский компаратор:

people.stream()
      .sorted(Comparator.comparing(Person::getName, String.CASE_INSENSITIVE_ORDER))
      .forEachOrdered(n->System.out.println(n.getName() + " " + n.getColour()));

и по цвету:

people.stream()
      .sorted(Comparator.comparing(Person::getColour, String.CASE_INSENSITIVE_ORDER))
      .forEachOrdered(n->System.out.println(n.getName() + " " + n.getColour()));
0 голосов
/ 20 декабря 2018

Как говорит другой ответ, вам нужно добавить операцию .sorted() в поток


Кроме того, я хотел бы предложить вам другой способ сравнения ваших Person:

static Comparator<Person> comparator = 
        Comparator.comparing(Person::getName, String.CASE_INSENSITIVE_ORDER)
                  .thenComparing(Person::getColour)
                  .thenComparing(Person::getAge);

@Override
public int compareTo(Person person) {
    return comparator.compare(this, person);
}

// with the different getters
0 голосов
/ 19 декабря 2018

Вы можете отсортировать его, используя Stream.sorted как:

people.stream()
      .sorted() // considering your `compareTo` implementation
      .forEach(n -> System.out.println(n.getName() + " " + n.getColour()));
...