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

时间:2015-08-11 16:11:45

标签: java data-structures javafx

我有以下课程GroupStudentsBySurname,它包含以下数据结构HashMap<String, ArrayList<Student>>。 每个Student对象都包含两个属性:surnameenglish_score

键是从学生对象Student.surname中取得的学生的姓氏。对于特定密钥Lee,它有一个ArrayList<Student>,其中学生共享相同的姓氏

GroupStudentsBySurname课程的一种方法是为具有相同姓氏的学生计算average_english_score

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

 Surname |  average_english_score    <- column headings
    Lee  |      65
   Chan  |      86
   Smith |      76

我希望每次 添加/删除 a {{}时,都可以使用跟踪课程GroupStudentsBySurname的更改来自arraylist的1}}对象,反过来影响Student属性。

问题:我不知道在这种情况下我应该使用 javafx 的数据结构?每当我添加/删除 average_english_score对象时,我是否需要使用ObservableMapObservableList 跟踪更改

2 个答案:

答案 0 :(得分:3)

JavaFX是一种UI技术,所以不完全确定你的意思是'来自JavaFX的数据结构'。

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

首先,我认为您需要引入另一个类(需要在equals上有效实现hashCodeStudent):

public class StudentGroup
{
  private Set<Student> students = new HashSet<>();
  private BigDecimal englishTotal = BigDecimal.ZERO;

  public BigDecimal getEnglishAverage()
  {
    return englishTotal.divide(students.size());
  }

  public Collection<Student> getStudents()
  {
    return Collections.unmodifiableCollection(students);
  }

  public void addStudent(Student student)
  {
    if (students.add(student))
    {
      englishTotal.add(student.getEnglishScore());
    }
  }

  public void removeStudent(Student student)
  {
    if (students.remove(student))
    {
      englishTotal.subtract(student.getEnglishScore());
    }
  }
}

您的班级GroupStudentsBySurname随后变为:

public class GroupStudentsBySurname
{
  private Map<String, StudentGroup> students = new HashMap<>();

  ...
}

然后创建一个适配器行类,这将允许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());
  }

  ...
}

一旦你有了这些课程,就可以按Oracle TableView tutorial的顺序插入JavaFX TableView,你可以像这样创建一个ObservableList

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

答案 1 :(得分:1)

我会使用ListViewTableView。在您的情况下,如果您只想操作列表,那么第一个更实用。否则,如果你真的想要使用整个地图,后者。