如何比较两个Object数组并将信息放在另一个?

时间:2014-10-11 03:36:27

标签: java arraylist compare

我有一个问题,我试图比较两个arraylist,以便我可以将信息作为一个完整编辑另一个,问题如上所述:

我有这个问题:

 public ArrayList consultaEntidadPresencial (GlpiEntities gentities){
    ArrayList consulta = new ArrayList();
    try {
        cnn=Conectar.getInstace();
        ps=cnn.prepareStatement("SELECT\n" + "glpi_entities.name,\n" + "Sum(glpi_tickettasks.actiontime)/3600 AS Tiempo\n" + "FROM\n" + "glpi_tickettasks\n" + "INNER JOIN glpi_tickets ON glpi_tickets.id = glpi_tickettasks.tickets_id\n" + "INNER JOIN glpi_entities ON glpi_tickets.entities_id = glpi_entities.id\n" + "WHERE\n" + "glpi_tickettasks.date BETWEEN ? AND ? AND\n" + "glpi_tickettasks.taskcategories_id = 4\n" +"GROUP BY\n" + "glpi_entities.name");
        ps.setDate(1,gentities.getfInicial());
        ps.setDate(2, gentities.getfFinal());
        rs=ps.executeQuery();
        while(rs.next()){
            GlpiEntities gtickets=new GlpiEntities();
            gtickets.setName(rs.getString(1));
            gtickets.setTiempoPresencial(rs.getDouble(2));

            consulta.add(gtickets);
        }
    } catch (NamingException ex) {
        Logger.getLogger(TasksDao.class.getName()).log(Level.SEVERE, null, ex);
    } catch (SQLException ex) {
        Logger.getLogger(TasksDao.class.getName()).log(Level.SEVERE, null, ex);
    }

    return consulta;
}

我还有另一个查询只改变glpi_tickettasks.taskcategories_id = 3(只是数字),这是因为在我们公司,我们将服务指定为远程或presencial(我尝试从查询中获取信息但我无法得到我想要的东西

执行这两个查询后,我得到两个带有对象的Arraylist,其中一个包含以下数据: 姓名:(授权名称) RemoteTime:1.5

和另一个: 姓名(名称) PresentialTime:5.5

当我想在网页上显示该信息时,我已经制作了一个控制器,其中包含以下代码:

if(request.getParameter("entidad")!=null && request.getParameter("entidad").equals("Enviar")){
        String fInicial=request.getParameter("inicial");
        String fFinal= request.getParameter("final");
        if(fInicial.length()<19 || fFinal.length()<19){
            response.sendRedirect("reportes/Reportegeneral.jsp?msg=Las fechas deben ser ingresadas con el formato Año-Mes-Día horas-minutos-segundos.");
        }else{
            GlpiEntities entities=new GlpiEntities();
            try {
                Date inicial=formatter.parse(fInicial);
                Date fechaF=formatter.parse(fFinal);
                fi=new java.sql.Date(inicial.getTime());
                ff=new java.sql.Date(fechaF.getTime());
                int arraySize=0;
                entities.setfInicial(fi);
                entities.setfFinal(ff);
                ArrayList<GlpiEntities> presencial=tdao.consultaEntidadPresencial(entities);
                ArrayList<GlpiEntities> remoto=tdao.consultaEntidadRemoto(entities);
                List<GlpiEntities> resultado= new ArrayList<GlpiEntities>();
                if(presencial.size()>remoto.size()){
                    arraySize=presencial.size();
                }else if (remoto.size()>presencial.size()) {
                    arraySize=remoto.size();
                }

                for (GlpiEntities presential: presencial){
                    for(GlpiEntities remote: remoto){
                        if(!presential.getName().equals(remote.getName())){
                            //out.print(" <br/> el valor de primer if es: "+presential.getName());
                            resultado.add(presential);
                        }else if(presential.getName().equals(remote.getName())){
                            presential.setTiempoRemoto(remote.getTiempoRemoto());
                            //out.print(" <br/> el valor de primer if es: "+presential.getName()+" Valor de remoto"+remote.getName());
                            resultado.add(presential);
                        }
                    }
                    for(GlpiEntities listado: resultado){
                        out.print(" <br/> Nombre entidad: "+listado.getName());
                        out.print(" <br/> Tiempo Presencial: "+listado.getTiempoPresencial());
                        out.print(" <br/> Tiempo Remoto: "+listado.getTiempoRemoto());
                    }
                }

                sesion.setAttribute("entidaddetalle", resultado);
                response.sendRedirect("reportes/Reportegeneral.jsp?resul=ok");




            } catch (ParseException ex) {
                Logger.getLogger(ReporteCtrol.class.getName()).log(Level.SEVERE, null, ex);
            }

        }
    }

正如你所看到的,我有一个If来评估哪个数组具有最高值我的意思是哪一个是更大的一个,这是因为我认为最好的方法是使用法线来读取数组但是然后是谷歌搜索我发现THIS LINK然后我试图使用for:each来解决问题但是当我执行一些证据时我已经意识到对象是新数组数百次因此我想要实现的是我想要比较两个数组,如果遥控器上的实体不存在于precenial数组,那么它应该被添加到一个新的arraylist,但是如果远程对象上的权限确实存在,那么我想将远程时间添加到该对象,然后将其添加到新的arraylist,但它不起作用,所以建议非常受欢迎。

PD:哦,差点忘了,你看到的Br只是为了知道正在处理的内容。

1 个答案:

答案 0 :(得分:1)

在任何一种情况下,您的代码都会将对象添加到resultado: a)preotocial存在于remoto中 b)在教育中不存在主教。

当您执行“presential”时,对于“remoto”,然后您将每个对象放在presential中并将其与remoto中的每个对象进行比较。当你在remoto中找到对象时,你应该打破比较,否则你会“意识到对象已进入新阵列数百次”。

我调整了你的代码

public List<GlpiEntities> consultaEntidadPresencial(GlpiEntities gentities) 
{
    List<GlpiEntities> consulta = new ArrayList<GlpiEntities>();
    try 
    {
        cnn = Conectar.getInstace();
        ps  = cnn.prepareStatement(
                "SELECT\n" 
                + "glpi_entities.name,\n" 
                + "Sum(glpi_tickettasks.actiontime)/3600 AS Tiempo\n"
                + "FROM glpi_tickettasks\n" 
                + "INNER JOIN glpi_tickets ON glpi_tickets.id = glpi_tickettasks.tickets_id\n" 
                + "INNER JOIN glpi_entities ON glpi_tickets.entities_id = glpi_entities.id\n" 
                + "WHERE\n" + "glpi_tickettasks.date BETWEEN ? AND ? AND\n" + "glpi_tickettasks.taskcategories_id = 4\n" 
                + "GROUP BY\n" + "glpi_entities.name");
        ps.setDate(1, gentities.getfInicial());
        ps.setDate(2, gentities.getfFinal());
        rs = ps.executeQuery();
        while (rs.next()) 
        {
            GlpiEntities gtickets = new GlpiEntities();
            gtickets.setName(
                    rs.getString(1));
            gtickets.setTiempoPresencial(
                    rs.getDouble(2));

            consulta.add(gtickets);
        }
    }
    catch (NamingException ex) 
    {
        Logger.getLogger(TasksDao.class.getName()).log(Level.SEVERE, null, ex);
    }
    catch (SQLException ex)
    {
        Logger.getLogger(TasksDao.class.getName()).log(Level.SEVERE, null, ex);
    }

    return consulta;
}

和if块

if (null != request.getParameter("entidad")
        && request.getParameter("entidad").equals("Enviar"))
{
    String fInicial = request.getParameter("inicial");
    String fFinal   = request.getParameter("final");

    if (fInicial.length() < 19
            || fFinal.length() < 19) 
    {
        response.sendRedirect(
                "reportes/Reportegeneral.jsp?msg=Las fechas deben ser ingresadas con el formato Año-Mes-Día horas-minutos-segundos.");
    }
    else
    {
        GlpiEntities entities = new GlpiEntities();
        try {
            Date inicial = formatter.parse(fInicial);
            Date fechaF  = formatter.parse(fFinal);
            fi = new java.sql.Date(
                    inicial.getTime());
            ff = new java.sql.Date(
                    fechaF.getTime());
            entities.setfInicial(fi);
            entities.setfFinal(ff);
            List<GlpiEntities> presencial = tdao.consultaEntidadPresencial(entities);
            List<GlpiEntities> remoto     = tdao.consultaEntidadRemoto(entities);
            List<GlpiEntities> resultado  = new ArrayList<GlpiEntities>();

            List<GlpiEntities> largerList = presencial.size() > remoto.size() ? presencial : remoto;
            List<GlpiEntities> smallerList = presencial.size() > remoto.size() ? remoto : presencial;

            if (presencial.size() == remoto.size())
            {
                largerList  = presencial;
                smallerList = remoto;
            }

            /** temporary values */
            boolean      exists = false;
            GlpiEntities tremote = null;

            for (GlpiEntities presential : presencial)
            {
                exists  = false;
                tremote = null ;

                for (GlpiEntities remote : remoto) 
                {
                    if (presential.getName().equals(remote.getName()))
                    {
                        exists  = true;
                        tremote = remote;
                        break;
                    }
                    /*
                    if (!presential.getName().equals(remote.getName())) 
                    {
                        //out.print(" <br/> el valor de primer if es: "+presential.getName());
                        resultado.add(presential);
                    } 
                    else if (presential.getName().equals(
                                remote.getName())) 
                    {
                        presential.setTiempoRemoto(
                                remote.getTiempoRemoto());
                        //out.print(" <br/> el valor de primer if es: "+presential.getName()+" Valor de remoto"+remote.getName());
                        resultado.add(presential);
                    }
                    */
                    if (exists)
                    {
                        presential.setTiempoRemoto(
                                tremote.getTiempoRemoto());
                    }
                    resultado.add(presential);
                }
            }

            for (GlpiEntities remote : remoto) 
            {
                exists  = false;    

                for (GlpiEntities presential : presencial)
                {
                    if (remote.getName().equals(presential.getName()))
                    {
                        exists = true;
                        break;
                    }
                }

                if (!exists)
                {
                    resultado.add(presential);
                }
            }

            for (GlpiEntities listado : resultado) 
            {
                out.print(" <br/> Nombre entidad: "    + listado.getName());
                out.print(" <br/> Tiempo Presencial: " + listado.getTiempoPresencial());
                out.print(" <br/> Tiempo Remoto: "     + listado.getTiempoRemoto());
            }

            sesion.setAttribute("entidaddetalle", resultado);
            response.sendRedirect("reportes/Reportegeneral.jsp?resul=ok"); 
        } 
        catch (ParseException ex) 
        {
            Logger.getLogger(
                    ReporteCtrol.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

如果准确地采用了您的代码,那么需要注意的部分是:

 boolean      exists  = false;
 GlpiEntities tremote = null ;

 for (GlpiEntities presential: presencial){
     exists  = false;
     tremote = null ;
     for(GlpiEntities remote: remoto){
         if(presential.getName().equals(remote.getName())){
             exists  = true;
             tremote = remote;
             break;                                                 
         }
     }
     if (exists) {
         presential.setTiempoRemoto(tremote.getTiempoRemoto());
         //out.print(" <br/> el valor de primer if es: "+presential.getName()+" Valor de remoto"+remote.getName());
     }
     resultado.add(presential);

     for(GlpiEntities listado: resultado){
         out.print(" <br/> Nombre entidad: "+listado.getName());
         out.print(" <br/> Tiempo Presencial: "+listado.getTiempoPresencial());
         out.print(" <br/> Tiempo Remoto: "+listado.getTiempoRemoto());
     }
 }

 for(GlpiEntities remote: remoto){
     exists  = false;
     for (GlpiEntities presential: presencial){
         if(remote.getName().equals(presential.getName())){
             exists  = true;
             break;                                                 
         }
     }
     if (!exists) {
         resultado.add(presential);
     }

     for(GlpiEntities listado: resultado){
         out.print(" <br/> Nombre entidad: "+listado.getName());
         out.print(" <br/> Tiempo Presencial: "+listado.getTiempoPresencial());
         out.print(" <br/> Tiempo Remoto: "+listado.getTiempoRemoto());
     }
 }

:)