当前位置: 首页 > 知识库问答 >
问题:

如何对对象列表进行排序在Java中,哪些列表包含对象列表?

白成济
2023-03-14

我有“MainClass”类的对象列表,它包含“Question”类的对象列表,它包含Option类的对象列表。如何按“Id”对“MainClass”类列表进行排序,以及按“Id”对“Option”类列表进行排序?

public class MainClass {
    private Long id;
    private List<Question> questions;
}

public class Question {
    private Set<Option> options;
}

public class Option{
    private Long id;
}

假设,List

result.stream().sorted(Comparator.comparing(MainClass::getId)).map(qc->qc.getQuestions()).flatMap(List::stream).map(q->q.getOptions()).flatMap(Set::stream).sorted(Comparator.comparing(Option::getId)).collect(Collectors.toList());

因此,我应该得到排序的List

我编写了源代码的示例/原型

public class MainClass {
    private Long id;
    private List<Question> questions;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public List<Question> getQuestions() {
        return questions;
    }

    public void setQuestions(List<Question> questions) {
        this.questions = questions;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        MainClass mainClass = (MainClass) o;
        return Objects.equals(id, mainClass.id) && Objects.equals(questions, mainClass.questions);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, questions);
    }
}


 class Question {
    private Set<Option> options;

     public Set<Option> getOptions() {
         return options;
     }

     public void setOptions(Set<Option> options) {
         this.options = options;
     }

     @Override
     public boolean equals(Object o) {
         if (this == o) return true;
         if (o == null || getClass() != o.getClass()) return false;
         Question question = (Question) o;
         return Objects.equals(options, question.options);
     }

     @Override
     public int hashCode() {
         return Objects.hash(options);
     }
 }

 class Option{
    private Long id;

     public Long getId() {
         return id;
     }

     public void setId(Long id) {
         this.id = id;
     }

     @Override
     public boolean equals(Object o) {
         if (this == o) return true;
         if (o == null || getClass() != o.getClass()) return false;
         Option option = (Option) o;
         return Objects.equals(id, option.id);
     }

     @Override
     public int hashCode() {
         return Objects.hash(id);
     }
 }

class Test{
    public static void main(String[] args) {
        Option option = new Option();
        option.setId(3L);
        Option option2 = new Option();
        option2.setId(2L);
        Option option3 = new Option();
        option3.setId(1L);

        Question question = new Question();
        question.setOptions(Set.of(option));
        Question question2 = new Question();
        question2.setOptions(Set.of(option2, option3));
        Question question3 = new Question();
        question3.setOptions(Set.of(option3));
        
        MainClass mc = new MainClass();
        mc.setId(1L);
        mc.setQuestions(List.of(question,question3));
        
        MainClass mc2 = new MainClass();
        mc2.setId(2L);
        mc2.setQuestions(List.of(question,question2));
        
        List<MainClass> list  = new LinkedList<>();
        list.add(mc);
        list.add(mc2);
    }
}

共有1个答案

巫马修为
2023-03-14

以下方法将根据要求进行排序:

public List<MainClass> sort(List<MainClass> list) {
    List<MainClass> sorted = list.stream()
            .map(t -> {
                t.questions.stream().forEach(t1 -> {
                    t1.options = t1.options.stream().sorted(Comparator.comparing(o -> o.id)).collect(Collectors.toSet());
                });
                return t;
            })
            .sorted(Comparator.comparing(o -> o.id))
            .collect(Collectors.toList());
    return sorted;
}
 类似资料:
  • 我有一个小问题,希望你能帮我解决。 我有一个名为Entity的类,它有几个属性,其中两个属性是id和实用程序: 然后,我在ArrayList中有几个Entity对象,如下所示: 现在,我想根据公用事业实体对列表进行排序。我使用一个定制的比较器,尝试了几种类似我在这里读到的解决方案: 但是在这条线上: 我遇到了以下错误:int不能被解引用,我不知道如何修复它。你们能帮我解决这个问题或者给出另一个解决

  • 我用的是Java 8号。我有一份汽车物品清单。我想按特定的顺序对它们进行排序。 每个汽车对象都属于一个模型。我喜欢按型号对汽车对象列表进行排序。排序后的列表应该是按照以下顺序,有车型的轿车SEDAN,然后是宝马,然后是独角兽。 所以当我打印排序后的列表时,它应该是这样的 如何使用自定义比较器在模型枚举上实现这种排序顺序。 如果你能帮忙,我很感激

  • 问题内容: 和骗局。如何按升序排序,然后按?有人可以帮忙吗?我知道在中具有通用算法和重载运算符,但是我是Java新手。 问题答案: 使实现或在单独的类中实现。然后致电: 要么 通常,如果有一个单一的“自然”排序顺序,则实施是个好主意…否则(如果你碰巧想要按特定顺序进行排序,但可能同样容易地希望使用另一个顺序),则最好实现。老实说,这种特殊情况可能会发生任何一种……但是我可能会坚持使用更灵活的选择。

  • 问题内容: 这个问题已经在这里有了答案 : 如何根据对象的属性对对象列表进行排序? (8个答案) 1年前关闭。 我有一个看起来像这样的对象列表。 Card(10,’H)在这里不是元组,而是对象。我知道如果列表中的每个项目都是元组形式的,如何对列表进行排序,就像这样, 但我不知道如何对对象列表进行排序。我想按第一个输入值(即Card()中的数字)对列表进行排序 我怎样才能做到这一点? 编辑:这是Ca

  • 我有一个过程对象列表,如下所示 我的程序课就像 我想基于以下条件对对象进行排序和分组。 应根据过程名称对所有过程进行分组。 过程必须按过程日期降序排列。[日期列表中的第一个元素,即 分组在一起的相同过程应按日期降序排列。 最终结果必须是, 我能够使用比较器和旧的Java代码实现这一点。是否可以使用java8流、收集器和分组来实现相同的功能?

  • 问题内容: 我试图按对象内的特定值对对象的数组列表进行排序。什么是做这种事情的最佳方法。我应该将Collections.sort()与某种比较器一起使用吗? 我试图用一个变量中包含的浮点值对对象列表进行排序。 编辑:这是我到目前为止: 错误状态:无法在原始类型double上调用compareTo(double)。 是因为比较器不能返回某种类型以外的任何东西吗? 问题答案: 如果你要查找默认排序,则