簡體   English   中英

在java中的ArrayList中合並具有相似字段的對象?

[英]Merge objects with similar fields in an ArrayList in java?

如果我有一個課程數組列表,每個課程都有一個名稱和一組學生,那么合並具有相同名稱的所有課程以使一個課程名稱在所有學生的數組中只出現一次的簡單方法是什么?

所以這樣的事情:

ArrayList<Course> courses = {Course("math", {student1, student2}),
                             Course("art", {student3, student4}),
                             Course("math", {student5, student6})};

會變成這樣:

ArrayList<Course> courses = {Course("math", {student1, student2, student5, student6}),
                             Course("art", {student3, student4})};

編輯:這是課程和學生課程,但我認為它們不應該太重要,我只是希望能夠將學生數組加在一起。

public class Course {
   String name;
   String[] students;

   public Course(String name, String[] students) {
      this.name = name;
      this.students = students;
   }
}

public class Student {
   String name;

   public Student(String name) {
      this.name = name;
   }
}

以下是步驟:

  1. 創建 HashMap <String, List> courseNameToStudents

  2. 迭代輸入課程元素。 對於每個課程元素:

    2a. 如果沒有 courseName 鍵(例如'math'),則將 (courseName, new List()) 添加到courseNameToStudents

    2b。 根據 courseName 鍵從courseNameToStudents中獲取值(學生列表)。 課程中的所有學生添加到此列表

  3. 創建結果課程列表。 瀏覽courseNameToStudents的條目集。 使用輸入鍵作為課程名稱和輸入值作為學生來創建新課程。 將以此方式創建的每門課程添加到結果列表中。 結果列表應該是你所期望的

祝你好運!

您可以將課程收集到Map<String, List<String>>然后為每個條目重新創建Course對象:

Map<String, List<String>> map = new HashMap<>();
for (Course course : courses) {
   var list = map.computeIfAbsent(course.name, k -> new ArrayList<String>());
   list.addAll(Arrays.asList(course.students));
}
List<Course> coursesCombined = new ArrayList<>();
for (var entry : map.entrySet()) {
    coursesCombined.add(
        new Course(
            entry.getKey(), 
            entry.getValue().toArray(new String[0])
        )
    );
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM