我有一个问题,我正在尝试比较两个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;
}
taskcategories_id=3(只是数字),这是因为在我们公司,我们将服务指定为远程或预服务(我尝试从查询中获取信息,但我无法得到我想要的)
在执行两个查询之后,我得到两个带有对象的Arraylist,其中一个具有以下数据:名称:(entitie name)RemoteTime:1.5
另一个:姓名(实体名称)当前时间: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);
}
}
}
正如你所看到的,我有一个如果,它评估哪个数组具有最高的值,我的意思是哪个是更大的,这是因为我认为最好的方法是使用普通的for来读取数组,但是在谷歌搜索之后,我找到了这个链接,然后我尝试使用for:每一个来解决这个问题,但是当我执行一些证明时,我已经意识到这个对象已经进入新数组数百次了,所以我想用这个来实现的是,我想比较两个数组,如果远程的实体不存在于前数组上,那么它应该被添加到一个新的数组列表中,但是如果整个数组在远程对象确实存在时,我想将远程时间添加到该对象,然后将其添加到新的数组列表中,但它不起作用,因此非常欢迎建议。
PD:哦,差点忘了,你看到的Br是用于调试的,只是为了知道正在处理什么。
在这两种情况下,您的代码都会将对象添加到结果中:a)前显存在于远程中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());
}
}
:)