【问题标题】:Two ArrayLists starting with the same data以相同数据开头的两个 ArrayList
【发布时间】:2014-12-22 10:37:03
【问题描述】:

您愿意在以下方面帮助我吗:

创建了 3 个具有定义值的 ArrayList 和一个 ArrayList,它将接收数据库中选择的值。然后,我想将名为 database 的 ArrayList 的值与具有我创建的已定义值的 ArrayLists 进行比较。

给出错误,因为名为 NIVELACESSOOper 的 ArrayList 只有数据:“Operacional”和名为 NIVELACESSOOperFin 的 ArrayList 有 2 个数据是“Operacional”和“Financeiro”,当我尝试运行名为 NIVELACESSOOperFin 的 ArrayList 时,正在运行 NIVELACESSOOper,因为两者从数据“Operacional”开始......即使我使用 .containsAll 比较也出错了,因为它比较的是第一个数据,而不是整个 ArrayList,称为 NIVELACESSOOperFin。继续只比较第一个数据。

希望得到您的支持!!!

    List NIVELACESSOOper; {

    NIVELACESSOOper = new ArrayList();
    NIVELACESSOOper.add("Operacional");
}

List NIVELACESSOOperFin; {

    NIVELACESSOOperFin = new ArrayList();
    NIVELACESSOOperFin.add("Operacional");
    NIVELACESSOOperFin.add("Financeiro");
}

List NIVELACESSOAdmFinOper; {

    NIVELACESSOAdmFinOper = new ArrayList();
    NIVELACESSOAdmFinOper.add("Administrador");
    NIVELACESSOAdmFinOper.add("Financeiro");
    NIVELACESSOAdmFinOper.add("Operacional");
}


public void Logar() {

    List result = new ArrayList();

    String sql = "SELECT usuario_login, senha_login, nome_login, nivelAcesso FROM nivelAcessoSistema NATURAL JOIN login WHERE usuario_login = ? AND senha_login = ?";

    try {

        pst = con.prepareStatement(sql);

        pst.setString(1, txtUsuario.getText()); //Campo do usuário
        pst.setString(2, txtSenha.getText()); //Campo da senha

        rs = pst.executeQuery();

        if (rs.next()) { //Se existe registro no banco de dados com os dados informados na tela de login...

            String nivelAcesso = rs.getString("nivelAcesso"); //Comparando valor de atríbuto "nivelAcesso" do banco de dados

            result.add(nivelAcesso);

            if (result.containsAll(NIVELACESSOOper)) {

                JOptionPane.showMessageDialog(null, "Enter the screen Operacional");
            }

            else if(result.containsAll(NIVELACESSOOperFin)) {

                JOptionPane.showMessageDialog(null, "Enter the screen Operacional - Financeiro");
            }

            else if (result.containsAll(NIVELACESSOAdmFinOper)) {

                JOptionPane.showMessageDialog(null, "Enter the screen Operacional - Financeiro - Administrativo");
            }

【问题讨论】:

  • 它是否给出了这个结果:""仅输入屏幕操作"?你打印了:nivelAcesso 吗?
  • 当我运行 NIVELACESSOOperFin 时正在运行 NIVELACESSOOper,因为两者都以数据“Operacional”开头。请参阅我的代码中的 ArrayLists。

标签: java select arraylist comparison


【解决方案1】:

看来您应该更改 if 语句的顺序以从最大列表开始:

        if (result.containsAll(NIVELACESSOAdmFinOper)) {

            JOptionPane.showMessageDialog(null, "Enter the screen Operacional - Financeiro - Administrativo");
        }

        else if(result.containsAll(NIVELACESSOOperFin)) {

            JOptionPane.showMessageDialog(null, "Enter the screen Operacional - Financeiro");
        }

        else if (result.containsAll(NIVELACESSOOper)) {

            JOptionPane.showMessageDialog(null, "Enter the screen Operacional");
        }

也就是说,您的 result 列表只能包含单个元素,因此只有 result.containsAll(NIVELACESSOOper) 可以返回 true。

我不完全确定您从数据库中读取的数据是什么,因为名称不是英文的,但如果您希望多行,您应该将代码更改为:

    while (rs.next()) { //Se existe registro no banco de dados com os dados informados na tela de login...

        String nivelAcesso = rs.getString("nivelAcesso"); //Comparando valor de atríbuto "nivelAcesso" do banco de dados

        result.add(nivelAcesso);
    }

只有在处理完所有行之后,您才能检查result 列表。

【讨论】:

  • 你可以发布一个例子吗?因为已经尝试了很多方法都没有得到我需要的结果。此代码是在登录时为用户创建限制。用户具有级别访问权限,因此当他登录时会读取他的访问级别并查看他们可以访问哪个系统屏幕。
  • @Gustavo 您是否希望您的 sql 查询返回不止一行?
  • 没错!应该返回 2 行!
  • @Gustavo 在这种情况下,请尝试我的答案中的代码。首先是 while (rs.next()) 循环,然后是改变顺序的 if 条件。
  • 因为您可以在代码中看到,ArrayList NIVELACESSOOperFin 有两个数据,即“Operacional”和“Financeiro”。与英语中的运营和财务相同。这些是访问级别。当用户登录时将过滤他的访问级别并打开他可以查看的系统屏幕。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-12
  • 2023-03-23
  • 2014-01-13
  • 2021-04-08
  • 1970-01-01
  • 2023-04-09
相关资源
最近更新 更多