【问题标题】:Sorting values of an arraylist objects and printing multiple of them in one lambda对 arraylist 对象的值进行排序并在一个 lambda 中打印其中的多个
【发布时间】:2019-05-20 09:39:15
【问题描述】:

我的目标是打印出四个值中的两个值 - 名称(字符串)和头发颜色(枚举) - 描述数组列表中的某个对象。问题在于按名称按字母顺序对打印列表进行排序。这一切都必须在一个 lambda 中。

我坚持只打印出来,没有排序。我已经设置了覆盖,但由于我还在学习,我似乎无法让它发挥作用。

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;
    }

【问题讨论】:

    标签: java sorting arraylist lambda java-stream


    【解决方案1】:

    您可以使用Stream.sorted 对其进行排序:

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

    【讨论】:

      【解决方案2】:

      由于你的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()));
      

      【讨论】:

        【解决方案3】:

        正如另一个答案告诉您的,您需要在流中添加.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
        

        【讨论】:

        【解决方案4】:

        listPersonVO.stream().sorted((o1, o2)->o1.getName().trim().compareTo(o2.getName().trim())).collect(Collectors.toList()) ;

        enter image description here

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-06-11
          • 2016-04-15
          • 2015-07-07
          • 2017-04-06
          • 2021-09-23
          • 1970-01-01
          • 2015-12-17
          • 1970-01-01
          相关资源
          最近更新 更多