Как пройти 2 списка и сделать проверку - PullRequest
1 голос
/ 06 июля 2019

У меня есть этот список, в котором будут сохранены идентификаторы всех моих выбранных флажков в соответствии с моей таблицей в базе данных ex: мои части таблицы в базе данных имеют следующие поля id / name / qtdPecas

List<Pecas> pecasList = new ArrayList<>();
    {
        if (checkMonitor.isSelected()) {
            Pecas p = new Pecas();
            p.setIdpecas(1);
            pecasList.add(p);
        }
        if (checkTeclado.isSelected()) {
            Pecas p = new Pecas();
            p.setIdpecas(2);
            pecasList.add(p);
        }
        if (checkMouse.isSelected()) {
            Pecas p = new Pecas();
            p.setIdpecas(3);
            pecasList.add(p);
        }
        if (checkVGA.isSelected()) {
            Pecas p = new Pecas();
            p.setIdpecas(4);
            pecasList.add(p);
        }
        if (checkPlacaMae.isSelected()) {
            Pecas p = new Pecas();
            p.setIdpecas(5);
            pecasList.add(p);
        }
        if (checkHD.isSelected()) {
            Pecas p = new Pecas();
            p.setIdpecas(6);
            pecasList.add(p);
        }
        if (checkFonte.isSelected()) {
            Pecas p = new Pecas();
            p.setIdpecas(7);
            pecasList.add(p);
        }
        if (checkRam.isSelected()) {
            Pecas p = new Pecas();
            p.setIdpecas(8);
            pecasList.add(p);
        }
        if (checkCabos.isSelected()) {
            Pecas p = new Pecas();
            p.setIdpecas(9);
            pecasList.add(p);
        }
        if (checkGravador.isSelected()) {
            Pecas p = new Pecas();
            p.setIdpecas(10);
            pecasList.add(p);
        }
        if (checkBateria.isSelected()) {
            Pecas p = new Pecas();
            p.setIdpecas(11);
            pecasList.add(p);
        }
    }

и у меня есть список, чтобы проверить, есть ли у вас запас этого элемента в базе данных

public List<Pecas> pegarPecas() {
    List<Pecas> pecaslist = new ArrayList<>();
    String sql = "SELECT * FROM  pecas";
    try {
        PreparedStatement stmt = con.prepareStatement(sql);
        ResultSet rs = stmt.executeQuery();
        while (rs.next()) {       
            Pecas pecas = new Pecas();
            pecas.setIdpecas(rs.getInt("id_pecas"));
            pecas.setNome(rs.getString("nome"));
            pecas.setQtd_Pecas(rs.getInt("qtdPecas"));
            pecaslist.add(pecas);
        }
        stmt.close();
        rs.close();
    } catch (SQLException ex) {
        Logger.getLogger(RequisicaoDAO.class.getName()).log(Level.SEVERE, null, ex);
        return null;
    }

    return pecaslist;
}

Я хотел бы просмотреть эти два списка, чтобы сделать проверку, чтобы получить идентификатор флажка, который выбрал пользовательсравните с идентификатором базы данных и выберите доступную сумму, которую я пытался сделать с этим:

  List<Pecas> pecasList2 = new ArrayList<>();{
    for (Pecas pecasVerificacao : pecasList) {
                pecasVerificacao.getIdpecas();
            for (Pecas pecasBanco : pecasDAO.pegarPecas()) {
            if(pecasBanco.getIdpecas() == pecasVerificacao.getIdpecas()){
                pecasVerificacao.setQtd_Pecas(pecasBanco.getQtd_Pecas());
                pecasVerificacao.getIdpecas();
                pecasList2.add(pecasVerificacao);
            }
    }
    } 
    }

Я не знаю, сделал ли я это наилучшим образом

однако я могу получитьнеобходимые данные для каждого выбранного элемента ID и количества

Теперь я не могу сделать, если, если количество каждого элемента в списке> 0, вызовите мой метод

Все это для проверки, еслиу вас есть количество деталей в базе данных больше 0, я не представляю другого способа сделать это, я новичок в java Если кто-нибудь мне поможет, я буду благодарен.

1 Ответ

1 голос
/ 06 июля 2019

Это не оптимально.

for (Pecas pecasVerificacao : pecasList) {
    for (Pecas pecasBanco : pecasDAO.pegarPecas()) {
         ...
    }
}

Это выполняет запрос один раз для каждого элемента в pecasList.В общем, вы хотите сохранить связь с БД / объем передаваемых данных до минимума.Извлечение всех элементов несколько раз не требуется.Простое исправление без особой необходимости переписывать - просто получить результаты только один раз и использовать их повторно:

final List<Pecas> pecas = pecasDAO.pegarPecas();
for (Pecas pecasVerificacao : pecasList) {
    for (Pecas pecasBanco : pecas) {
         ...
    }
}

Однако при этом получается больше данных, чем вам действительно нужно.Оператор IN может использоваться для получения только тех значений, которые вас интересуют. Кроме того, ваш первый фрагмент кода содержит много стандартного кода.Чтобы избежать этой проблемы, сохраните свои CheckBox в списке:

private CheckBox[] checkBoxes; 

Убедитесь, что следующий код выполняется один раз после создания CheckBox es.

checkBoxes = new CheckBox[] {
    checkMonitor,
    checkTeclado,
    checkMouse,
    checkVGA,
    checkPlacaMae,
    checkHD,
    checkFonte,
    checkRam,
    checkCabos,
    checkGravador,
    checkBateria
};

(Выможет потребоваться использовать другую структуру данных для хранения данных, если вы не можете гарантировать, что диапазон индекса равен 1, ..., n).

Таким образом, вы можете переписать заполнение кода pecasList следующим образом (Я просто храню идентификаторы здесь):

List<Integer> pecasList = new ArrayList<>();
for (int i = 0; i < checkBoxes.length; i++) {
    if (checkBoxes[i].isSelected()) {
        pecasList.add(i+1);
    }
}
public List<Pecas> pegarPecasById(List<Integer> ids) {
    if (ids.isEmpty()) {
        return new ArrayList<>(0);
    } else {
        String sql = ids.stream().map(Object::toString).collect(Collectors.joining(",", "SELECT * FROM pecas WHERE id_pecas IN (", ")"));

        try {
            PreparedStatement stmt = con.prepareStatement(sql);
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {       
                Pecas pecas = new Pecas();
                pecas.setIdpecas(rs.getInt("id_pecas"));
                pecas.setNome(rs.getString("nome"));
                pecas.setQtd_Pecas(rs.getInt("qtdPecas"));
                pecaslist.add(pecas);
            }
            stmt.close();
            rs.close();
        } catch (SQLException ex) {
            Logger.getLogger(RequisicaoDAO.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }

        return pecaslist;
    }
}

Таким образом, вы получаете только результаты для отмеченных флажков.Это должно сделать ненужным вложенный цикл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...