在下面的示例中,我应该使用什么JavaFX数据结构?

在下面的示例中,我应该使用什么JavaFX数据结构?,java,data-structures,javafx,Java,Data Structures,Javafx,我有下面的GroupStudentsBySurname类,它包含下面的数据结构HashMap。 每个学生对象包含两个属性:姓氏和英语成绩 键是从学生对象Student.name中提取的学生的姓氏。对于一个特殊的key Lee,它有一个ArrayList,其中学生使用相同的姓氏 此GroupStudentsBySburName课程的方法之一是计算同姓学生的平均英语成绩 我将为GroupStudentsBySurname类使用TableView数据结构,如下所示: Surname | avera

我有下面的GroupStudentsBySurname类,它包含下面的数据结构HashMap。 每个学生对象包含两个属性:姓氏和英语成绩

键是从学生对象Student.name中提取的学生的姓氏。对于一个特殊的key Lee,它有一个ArrayList,其中学生使用相同的姓氏

此GroupStudentsBySburName课程的方法之一是计算同姓学生的平均英语成绩

我将为GroupStudentsBySurname类使用TableView数据结构,如下所示:

 Surname |  average_english_score    <- column headings
    Lee  |      65
   Chan  |      86
   Smith |      76
我希望能够在每次从arraylist添加/删除学生对象时使用track跟踪class GroupStudentsBySurname的更改,这反过来会影响average_english_score属性


问题:我不知道在这种情况下应该使用javafx中的什么数据结构?无论何时添加/删除学生对象,我都需要使用ObservableMap或ObservableList来跟踪更改

我会使用a或a。在您的情况下,如果您只是想能够操纵列表,那么第一个更实用。否则,如果您真的要使用整个地图,请使用后者。

我将使用a或a。在您的情况下,如果您只是想能够操纵列表,那么第一个更实用。否则,如果你真的想使用整个地图,就使用后者。

JavaFX是一种UI技术,所以不能完全确定“来自JavaFX的数据结构”是什么意思

无论如何,让我们从数据模型开始,稍后我们将进入UI

首先,我认为您需要引入另一个类,该类需要在Student上有效地实现equals和hashCode:

然后创建一个adapter row类,该类将允许StudentGroup在更多分组场景中使用,而不仅仅是按姓氏分组,这将与JavaFX一起使用:

public class StudentBySurnameRow
{
  private SimpleStringProperty surname;
  private SimpleStringProperty groupSize;
  private SimpleStringProperty englishAverage;

  public StudentBySurnameRow(String surname, StudentGroup studentGroup)
  {
    this.surname = new SimpleStringProperty(surname);
    this.groupSize = new SimpleStringProperty(Integer.toString(studentGroup.getStudents().size()));
    this.englishAverage = new SimpleStringProperty(studentGroup.getEnglishAverage().toString());
  }

  ...
}
一旦您拥有了这些类,就可以根据创建如下可观察列表的位置将它们放入JavaFX TableView中:

List<StudentBySurnameRow> studentBySurnameRows = new ArrayList<>();
for (Map.Entry<String, StudentGroup> entry : groupStudentsBySurname.getStudents().entrySet())
{
  studentBySurnameRows.add(new StudentBySurnameRow(entry.getKey(), entry.getValue()));
}

table.setItems(FXCollections.observableArrayList(studentBySurnameRows));

JavaFX是一种UI技术,所以不能完全确定“来自JavaFX的数据结构”是什么意思

无论如何,让我们从数据模型开始,稍后我们将进入UI

首先,我认为您需要引入另一个类,该类需要在Student上有效地实现equals和hashCode:

然后创建一个adapter row类,该类将允许StudentGroup在更多分组场景中使用,而不仅仅是按姓氏分组,这将与JavaFX一起使用:

public class StudentBySurnameRow
{
  private SimpleStringProperty surname;
  private SimpleStringProperty groupSize;
  private SimpleStringProperty englishAverage;

  public StudentBySurnameRow(String surname, StudentGroup studentGroup)
  {
    this.surname = new SimpleStringProperty(surname);
    this.groupSize = new SimpleStringProperty(Integer.toString(studentGroup.getStudents().size()));
    this.englishAverage = new SimpleStringProperty(studentGroup.getEnglishAverage().toString());
  }

  ...
}
一旦您拥有了这些类,就可以根据创建如下可观察列表的位置将它们放入JavaFX TableView中:

List<StudentBySurnameRow> studentBySurnameRows = new ArrayList<>();
for (Map.Entry<String, StudentGroup> entry : groupStudentsBySurname.getStudents().entrySet())
{
  studentBySurnameRows.add(new StudentBySurnameRow(entry.getKey(), entry.getValue()));
}

table.setItems(FXCollections.observableArrayList(studentBySurnameRows));

看起来您已经有了一个数据结构。Maslor给出了一个答案,建议使用UI组件来显示数据结构。这就是你想要的吗?或者您是否对如何使用JavaFX特定的数据结构和习惯用法(如ObservableList、ObservableMap和bindings)反映现有数据结构的信息感兴趣。总的来说,这个问题对我来说很不清楚,你可能需要编辑它来澄清你的问题是什么。另外,请提供支持您的功能的设施。@sea抱歉,我之前的问题不清楚。请查看更新。您似乎已经有了数据结构。Maslor给出了一个答案,建议使用UI组件来显示数据结构。这就是你想要的吗?或者您是否对如何使用JavaFX特定的数据结构和习惯用法(如ObservableList、ObservableMap和bindings)反映现有数据结构的信息感兴趣。总的来说,这个问题对我来说很不清楚,你可能需要编辑它来澄清你的问题是什么。另外,请提供支持您的功能的设施。@sea抱歉,我之前的问题不清楚。请查看更新。我想问为什么需要两个类:StudentGroup和GroupStudentsBySurname。在这种情况下,他们似乎都做同样的工作。两个类之间的区别是什么?我看不到GroupStudentsBySburName的代码,但假设它包含对创建StudentGroups的学生进行分组的逻辑。我想问为什么需要两个类:StudentGroup和GroupStudentsBySburName。在这种情况下,他们似乎都做同样的工作。两个类之间的区别是什么?我看不到GroupStudentsBySurname的代码,但假设它包含对创建StudentGroups的学生进行分组的逻辑