java - 如何浏览 2 个列表并进行检查

标签 java javafx

我有这个列表,它将根据我在 ex 数据库中的表保存所有选定复选框的 id:数据库中的我的表部分具有以下字段 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);
        }
    }

我有一个 list 来检查您的数据库中是否有该商品的库存

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

我想遍历这两个列表来进行检查,选取用户选择的复选框的 id 与数据库的 id 进行比较,并选取我尝试执行此操作的可用金额:

  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 及数量

现在我不能做 if 如果列表中每个项目的数量 > 0 调用我的方法

这一切都是为了检查数据库中的零件数量是否大于 0 我没想到还有另一种方法 我是java新手 如果有人帮助我,我将不胜感激。

最佳答案

这不是最佳选择。

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; 

确保在创建 CheckBoxes 后执行一次以下代码。

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

(如果不能保证索引范围为1, ..., n,您可能需要使用不同的数据结构来存储数据。

这样您就可以重写填充 pecasList 的代码,如下所示(我只是在此处存储 id):

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

这样您就可以获得复选框的唯一结果。这应该使嵌套循环变得不必要。

关于java - 如何浏览 2 个列表并进行检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56910131/

相关文章:

java - JPA 将具有 PK 的实体映射到具有复合 PK 的实体

java - 我希望我的 JLayeredPane 能够捕获所有事件

java - 在 JavaFX 中用 Canvas 绘制笛卡尔平面图

java - 尝试运行 javafx 应用程序时出现 "FXMLLoader.constructLoadException"

JavaFX:带有图像按钮的工具栏

silverlight - JavaFX 和 Silverlight 的缺点是什么?

java - 如何测量刚收到的 UDP 数据包大小?

java - chromedriver window.navigator.webdriver 标志对于 chrome v80+ 为 true

java - 如何为单个引擎实例设置 java-8 Nashorn javascript 引擎选项

java - 无法访问 FXML 控件