gpt4 book ai didi

java - 我应该在以下示例中使用哪种 JavaFX 数据结构?

转载 作者:行者123 更新时间:2023-11-29 03:06:32 25 4
gpt4 key购买 nike

我有以下类(class) GroupStudentsBySurname它包含以下数据结构 HashMap<String, ArrayList<Student>> .每个Student对象包含两个属性:surnameenglish_score

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

这个GroupStudentsBySurname的方法之一类是计算average_english_score对于具有相同姓氏的学生。

我会使用 TableView类的数据结构 GroupStudentsBySurname ,看起来像下面这样:

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

我希望能够使用类 GroupStudentsBySurname跟踪更改每次我添加/删除一个Student来自 arraylist 的对象,这又会影响 average_english_score属性。

问题:我不知道在这种情况下我应该使用 javafx 的什么数据结构?我需要使用 ObservableMap 吗?或 ObservableList每当我添加/删除一个Student跟踪变化目的。

最佳答案

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

无论如何,让我们从数据模型开始(我们稍后会介绍 UI)。

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

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

你的类(class) GroupStudentsBySurname 然后变成:

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

...
}

然后创建一个 adapter 行类,这将允许 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));

关于java - 我应该在以下示例中使用哪种 JavaFX 数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31946844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com