Java中两个List的比较以及使用JSTL在JSP中以表格格式显示两个List之间的区别

Posted

技术标签:

【中文标题】Java中两个List的比较以及使用JSTL在JSP中以表格格式显示两个List之间的区别【英文标题】:Comparison of two List in Java and displaying the difference between two List in tabular format in JSP using JSTL 【发布时间】:2015-04-20 10:00:56 【问题描述】:

我有两个 Arraylist 即-

    List<java_test> one=new ArrayList<java_test>();
    List<java_test> two=new ArrayList<java_test>();

有两个方法分别返回定义的 ArrayList 值。 第一个数组列表,即 与第二个数组列表(即两个)相比,具有更多的值。

现在我想

比较两个数组列表的值并找出那里 区别

并以表格格式显示。此外,作为第一个第一个数组,一个具有更多的值与两个相比。因此,当只有一个数组的值时0 应该显示为有差异。

EDIT-1

我试图实现计算差异-

 public LinkedHashMap < String, List < Double >> diff() 
   for (int i = 0; i < one.size() && i < two.size(); i++) 
     Comaprision refObj = one.get(i);
     Comaprision stObj = two.get(i);
     Double x = refObj.getBeam_current();
     Double y = stObj.getBeam_current();


     x = refObj.getBeam_energy();
     y = stObj.getBeam_energy();
     comparing(x, y);

     x = refObj.getSt2_vs2_bag1_rb();
     y = stObj.getSt2_vs2_bag1_rb();
     comparing(x, y);

     x = refObj.getSt2_vs2_bag2_rb();
     y = stObj.getSt2_vs2_bag2_rb();
     comparing(x, y);

     x = refObj.getSt2_vs2_bag3_rb();
     y = stObj.getSt2_vs2_bag3_rb();
     comparing(x, y);

     x = refObj.getSt2_vs2_bag4_rb();
     y = stObj.getSt2_vs2_bag4_rb();
     comparing(x, y);


     dif.put("", z);


   
   return dif;
 

 public List < Double > comparing(Double x1, Double y1) 

   if ((x1 > y1)) 

     z.add(x1 - y1);
     System.out.println("value of z is" + z);
    else 
     z.add(y1 - x1);

   


   return z;
 

我收到的输出是- 但它没有给出正确的区别。我犯了什么错误?

【问题讨论】:

您在尝试完成此操作时究竟遇到了什么问题? @Takendarkk 看到我的编辑。 正如你所说的one arraylist 有比two 更多的元素,这不会因为ArrayIndexOutOfBoundException 而失败吗? 【参考方案1】:

如果我正确理解了您的问题。如果两个数组列表都具有相同索引的值,您想要做的是打印差异,或者当只有一个数组列表具有相同索引的值时打印零。

对此有两种可能。

如果您的数组列表仅包含非零值。您可以按如下方式更改 for 循环的条件

for (int i = 0; i < one.size(); i++) // since you have already specified first array list is larger than the second.

然后改变比较函数如下:

public List < Double > comparing(Double x1, Double y1) 

 if(y1 == 0)
 
    z.add(0);
 
 else
 if ((x1 > y1)) 

 z.add(x1 - y1);
 System.out.println("value of z is" + z);
  else 
 z.add(y1 - x1);

 


 return z;
 

如果您的数组列表包含零值。我建议做这样的事情

 public LinkedHashMap < String, List < Double >> diff() 
   for (int i = 0; i < one.size(); i++) 
     if(i < two.size())
     Comaprision refObj = one.get(i);
     Comaprision stObj = two.get(i);
     Double x = refObj.getBeam_current();
     Double y = stObj.getBeam_current();


     x = refObj.getBeam_energy();
     y = stObj.getBeam_energy();
     comparing(x, y);

     x = refObj.getSt2_vs2_bag1_rb();
     y = stObj.getSt2_vs2_bag1_rb();
     comparing(x, y);

     x = refObj.getSt2_vs2_bag2_rb();
     y = stObj.getSt2_vs2_bag2_rb();
     comparing(x, y);

     x = refObj.getSt2_vs2_bag3_rb();
     y = stObj.getSt2_vs2_bag3_rb();
     comparing(x, y);

     x = refObj.getSt2_vs2_bag4_rb();
     y = stObj.getSt2_vs2_bag4_rb();
     comparing(x, y);


     
     
     else
        for(i=0; i<(the number of variables your comparing in the if condition above); i++)
        
        z.add(0.0);
        
     
   
   dif.put("", z);
   return dif;
 

 public void comparing(Double x1, Double y1) 

   if ((x1 > y1)) 

     z.add(x1 - y1);
     System.out.println("value of z is" + z);
    else 
     z.add(y1 - x1);

   
 

【讨论】:

您理解正确。但是 elsedif.put("",0.0); 有一个问题。 。它显示了一个异常HashMap>类型中的方法put(String, List)不适用于参数(String, double).如何纠正它。 我已经粘贴了我的输出。按照上述操作后,没有显示正确的差异。 for (int i = 0; i 你需要在我添加的 else 条件中再添加一个 for 循环。 现在在 Comaprision stObj = two.get(i) 行,索引越界显示为两个 List 的值比一个 List 少。【参考方案2】:

这可能会解决这个问题。但是我还没有在使用自写类的对象上尝试过。

public static void main(String[] args) 
    // TODO Auto-generated method stub

    List<String> list1 = new ArrayList<String>();
    List<String> list2 = new ArrayList<String>();


    /*Put values to both lists*/
    list1.add("John");
    list1.add("Doe");

    list2.add("John");
    list2.add("Doe");

    /*Add other objects to list2. This will be the differences*/
    list2.add("Jane");
    list2.add("Roe");


    System.out.println("Printing two lists before retaining differences");
    System.out.println("list1: "+list1);
    System.out.println("list2: "+list2+"\n");

    System.out.println("Similarities removed. Differences stored to list2");
    list2.removeAll(list1);
    System.out.println("differences: "+list2);

【讨论】:

不,我的列表中有 double 类型的值。我必须从两个列表中减去值并查看差异。【参考方案3】:

我不知道您进行比较的算法是否正确。例如,如果 x1 = -1 且 x2 = 5:x2 - x1 = 5 - (-1) = 5 + 1 = 6

public static void main(String[] args) 
    // TODO Auto-generated method stub

    List<Double> list1 = new ArrayList<Double>();
    List<Double> list2 = new ArrayList<Double>();
    List<Double> result = new ArrayList<Double>(); //where result will be stored

    //Load with values
    list1.addAll(Arrays.asList(new Double[]3.0,-5.0,7.0,-9.0,11.0,-13.0));
    list2.addAll(Arrays.asList(new Double[]1.0,1.0,1.0,1.0,1.0,1.0));
    System.out.println("list1: "+list1);
    System.out.println("list2: "+list2);

    for(int i=0; i<list1.size() && i<list2.size(); i++) 
        double d1 = list1.get(i);
        double d2 = list2.get(i);

        //If d1 is greater than d2, do d1 minus d2 otherwise do d2 minus d1
        //I don't know if that is really the purpose of doing the difference in your code
        //Store result to result list
        result.add( d1>d2 ? d1-d2 : d2-d1);

    

    //Print the result
    System.out.println("result: "+result);

【讨论】:

我的数组列表不包含负值,并且我的列表属于我的问题中提到的对象类型。 好的。因此,请确保两个列表具有相同的大小。例如,如果第一个索引中有一个没有值的索引,则必须为其提供 0。这样可以确保两个列表的大小相同。 我的列表可以是相同大小的,我也不能提供 0,将 sql 查询的结果集添加到列表中。 好的,明白了。那么你认为结果在哪里不正确,后端还是前端?您可以在后端 Java 类上执行 System.out.println()。

以上是关于Java中两个List的比较以及使用JSTL在JSP中以表格格式显示两个List之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

JSTL取List的长度

java相关 关于List前台显示

两个list进行比较

详解javaweb中jstl如何循环List中的Map数据_java - JAVA

Java集合的常用类以及特点

JSP 标准标签库(JSTL)的各种使用方法,日期格式化,日期大小比较等