Как отобразить определенные элементы из ArrayList на основе значения из другого ArrayList? - PullRequest
0 голосов
/ 22 ноября 2018

В настоящее время я выполняю задачу, в рамках которой мне нужно создать решение для разработки программного обеспечения, которое позволит менеджерам добавлять новых сотрудников и задачи.для этого у меня есть ArrayList с именем staffMembers, который принимает имя, оценку и оклад в качестве параметров, и список массивов с именем tasksToDo, который принимает taskName, taskGrade и taskHours в качестве параметров.

Одно из требований состоит в том, чтобы позволить менеджерам щелкнуть JButton, и это будет отображать только staffMembers, чья оценка равна или превышает TaskGrade для выбранной задачи (это выбирается с помощью JComboBox),результат будет отображаться в JTable.

private void jButtonSelectTaskActionPerformed(java.awt.event.ActionEvent evt) {                                                  

    int num1 = this.jobGrade;//use the int supplied 
    //by user
    String[] colNames = {"Name", "Grade", "Montlhly Salary/Hourly Rate"};
    DefaultTableModel model = (DefaultTableModel) staffByTaskGradeTable.getModel();

    Object rowData[][] = new Object[staffMembers.size()][3];
    for (int i = 0; i < staffMembers.size(); i++) {
        if (staffMembers.get(i).grade > num1) {

            rowData[i][0] = staffMembers.get(i).name;
            rowData[i][1] = staffMembers.get(i).grade;
            rowData[i][2] = staffMembers.get(i).getCost();

            model.setDataVector(rowData, colNames);
        }
    }

Однако приведенный выше код не дает требуемого результата, и я надеялся, что кто-нибудь сможет указать мне правильное направление.

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018
Object rowData[][] = new Object[staffMembers.size()][3];
for (int i = 0; i < staffMembers.size(); i++) {
    if (staffMembers.get(i).grade > num1) {

        rowData[i][0] = staffMembers.get(i).name;
        rowData[i][1] = staffMembers.get(i).grade;
        rowData[i][2] = staffMembers.get(i).getCost();

        model.setDataVector(rowData, colNames);
    }
}

Не используйте код, как указано выше.Вы резервируете место в своем 2D-массиве, если все сотрудники выбраны.Что, если только первый и последний соответствуют вашим критериям?У вас будет куча пустых строк в середине таблицы.

Вместо этого вам просто нужно динамически добавить строку данных в модель, когда ваши конкретные критерии будут выполнены.Что-то вроде:

String[] colNames = {"Name", "Grade", "Montlhly Salary/Hourly Rate"};
DefaultTableModel model = new DefaultTableModel(colNames, 0); // create empty model


for (int i = 0; i < staffMembers.size(); i++) {
    if (staffMembers.get(i).grade > num1) {
        Vector<Object> row = new Vector<Object>(3);
        row.add( staffMembers.get(i).name );
        row.add( staffMembers.get(i).grade );
        row.add( staffMembers.get(i).getCost() );
        model.addRow( row );
    }
}

staffByTaskGradeTable.setModel( model );

Вам все еще нужно отладить, почему ваше «если условие» не выполняет то, что вы ожидаете.

Или как вы знаете, что вы заменяете данные вмодель стола, которая видна на раме.Может быть, у вас есть экземпляр таблицы, и только один виден на кадре.Просто протестируйте его, чтобы просто заменить весь код в вашем методе на:

DefaultTableModel model = new DefaultTableModel(5, 5); 
staffByTaskGradeTable.setModel(model);

Теперь вы должны увидеть пустую таблицу с 5 строками и 5 столбцами.Если это работает, проблема с вашим условием "если".Данные не соответствуют вашим ожиданиям.

0 голосов
/ 22 ноября 2018

Вы устанавливаете model.setDataVector каждый раз, когда получаете совпадение.Кроме того, (sm.grade > num1) должно иметь> = сравнение, если вы хотите, чтобы был равен или больше оценка.

Кроме того, вы не должны использовать get (i) несколько раз, делайте это один раз и сохраняйтев переменной для любых дальнейших действий.Или просто используйте forEach. (Или лямбда, если Вы используете java8 +)

private void jButtonSelectTaskActionPerformed(java.awt.event.ActionEvent evt) {                                                  

int num1 = this.jobGrade;//use the int supplied 
//by user
String[] colNames = {"Name", "Grade", "Montlhly Salary/Hourly Rate"};
DefaultTableModel model = (DefaultTableModel) staffByTaskGradeTable.getModel();

List<Object[]> rowData = new ArrayList<>();
Object[] member;
for (StaffMember sm:staffMembers) {
    if (sm.grade >= num1) {
        rowData.add(new Object[] {(Object)sm.name, (Object)sm.grade, 
                 (Object)sm.getCost()});
    }
}
model.setDataVector(rowData.toArray(new Object[rowData.size()][]), colNames);
...