2015-08-11 5 views
1

У меня есть следующий класс GroupStudentsBySurname и содержит следующую структуру данных HashMap<String, ArrayList<Student>>. Каждый Student объект содержит два атрибута: surname и english_scoreКакую структуру данных JavaFX следует использовать в следующем примере?

Ключи являются фамилии студентов, принятых от объекта Student Student.surname. Для определенного ключа Lee у него есть ArrayList<Student>, где учащиеся делятся одинаковыми фамилия.

Одним из методов этого класса GroupStudentsBySurname является вычисление average_english_score для учащихся, имеющих одну и ту же фамилию.

Я хотел бы использовать структуру TableView данных для класса GroupStudentsBySurname, который выглядит следующим образом:

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

Я хочу, чтобы иметь возможность использовать отслеживать изменения класса GroupStudentsBySurname каждый раз, когда я оных/delete a Student объект от архаиста, который, в свою очередь, влияет на атрибут average_english_score.

Вопрос: Я не знаю, что структура данных от JavaFX следует использовать в данном случае? Мне нужно будет использовать ObservableMap или ObservableList до отслеживать изменения всякий раз, когда я добавить/удалить a Student объект.

+1

Это похоже, у вас уже есть структура данных. Маслор дал ответ, предлагая компоненты пользовательского интерфейса для отображения структуры данных. Это то, что вы хотите? Или вас интересовала информация о том, как отразить существующую структуру данных, используя специфические структуры данных JavaFX и идиомы, такие как ObservableList, ObservableMap и привязки. В целом, этот вопрос для меня совершенно неясен, вам, вероятно, нужно отредактировать его, чтобы уточнить, каков ваш вопрос. Кроме того, [Java 8 lambdas] (https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html) предоставляют возможности для поддержки ваших функций. – jewelsea

+0

@jewelsea Извините, раньше я не знал о своем вопросе. См. Обновления. – mynameisJEFF

ответ

1

Я бы использовал либо ListView, либо TableView. В вашем случае, если вы просто хотите, чтобы иметь возможность манипулировать списком, первое было бы более практичным. В противном случае, если вы действительно хотите использовать всю карту, последнюю.

3

JavaFX - это пользовательский интерфейс, поэтому не совсем уверен, что вы подразумеваете как «структуру данных из JavaFX».

В любом случае, давайте начнем с модели данных (мы перейдем к интерфейсу позже).

Сначала я думаю, что вам нужно ввести еще один класс (который требует действительного осуществления 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 для более сложных сценариев группировки, чем просто сгруппированных по surnam е и то, что будет использоваться с 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 согласно Oracle TableView tutorial, где бы вы создать 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)); 
+0

Я хочу спросить, почему должны быть 2 класса: 'StudentGroup' и' GroupStudentsBySurname'. Кажется, что они оба выполняют ту же работу в этом случае. В чем разница между двумя классами? – mynameisJEFF

+0

Я не вижу код для 'GroupStudentsBySurname', но предположил, что он содержит логику, что * группы *' 'Студенты' 'создания' StudentGroup'' –

Смежные вопросы