2014-10-11 4 views
1

У меня есть проблема, я пытаюсь сравнить два ArrayList, так что я могу Fullfile другой информации, как один, проблема описана выше:Как сравнить два массива объектов и поместить информацию в другую?

У меня есть этот запрос:

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 (просто число), это потому, что в нашей компании мы указываем службы как удаленные или предварительные (я пытался получить информацию из запроса, но я не смог получить что я хотел)

af Выполняя оба запроса, я получаю два Arraylist с объектами на нем, один имеет следующие данные: имя: (имя entitie) RemoteTime: 1,5

и другое: Имя (имя entitie) 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); 
      } 

     } 
    } 

Как вы можете видеть, у меня есть Если, который определяет, какие из массивов имеет значение higest я имею в виду, какая из чем больше, тем лучше, я думал, что лучше путь использовал обычный для чтения массивы, но затем по поиску google, который я нашел THIS LINK, а затем я попытался использовать для каждого: для решения проблемы, но когда я выполнял некоторые доказательства, я понял, что объект был в новом массиве. Сотни раз, так что я хочу достичь с этим, я хочу сравнить два массива, и если сущности, находящиеся на удаленном компьютере, не существуют в предварительном массиве, то он должен быть добавлен к новому arraylist, но если существует право на удаленный объект, я хочу добавить удаленное время к этому объекту, а затем добавить его в новый arraylist, но он не работает, поэтому предложения очень приветствуются.

PD: oh почти забыл о том, что Br вы видите для отладки, просто чтобы знать, что обрабатывается.

ответ

1

Ваш код добавляет объект в результат в любом случае: a) presencial существует в remoto b) presencial не существует в remoto.

Когда вы делаете для «presential», для «remoto», вы берете каждый объект в настоящем и сравниваете его с каждый объект в 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 (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()); 
    } 
} 

:)

+0

Wow Большое вам спасибо за ваш h elpl, теперь я близок к решению, но у меня есть кое-что, чтобы спросить, посмотреть, что я хотел достичь, это следующее: – Leo21

+0

Если имя текущего объекта существует на удаленном имени, тогда удаленное время должно быть добавлено к представлению и представлению объект добавляется к новому arraylist, но если объект в представлении не существует на удаленном компьютере, он должен быть добавлен к новому arraylist, и, наконец, если объект objet on remote не существует в представлении, он должен быть добавлен к новому arraylist, поэтому как я могу это достичь? Я думал о другом: для оценки последнего условия, но я действительно не знаю, является ли это лучшим решением. – Leo21

+0

Что мешает вам реализовать его с помощью другого _for_? Я не знаю, если это лучшее решение. :) – Willmore

Смежные вопросы