我有以下课程GroupStudentsBySurname
,它包含以下数据结构HashMap<String, ArrayList<Student>>
。
每个Student
对象都包含两个属性:surname
和english_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
对象时,我是否需要使用ObservableMap
或ObservableList
跟踪更改。
答案 0 :(得分:3)
JavaFX是一种UI技术,所以不完全确定你的意思是'来自JavaFX的数据结构'。
无论如何,让我们从数据模型开始(稍后我们将进入UI)。
首先,我认为您需要引入另一个类(需要在equals
上有效实现hashCode
和Student
):
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)