我们如何比较两个列表?

时间:2013-12-07 07:06:22

标签: java

我有两个类列表,即Database1的StuPersonal,不同大小的StuPersonal of Database2。

 public List<StuPersonal> stpers(){

      int size=0;

   Session s=getmSession();
   Transaction tx=s.beginTransaction();

  List<StuPersonal> splM=new ArrayList();

   Query q=s.createQuery("from StuPersonal"); 

   splM=q.list();

    tx.commit();
    s.close();

    return splM;

  }

 public List<StuPersonal> stpersl(){

      int size=0;
      List<StuPersonal> splL=new ArrayList();


   Session s=getlSession();
   Transaction tx=s.beginTransaction();

   List<StuPersonal> spl=new ArrayList();

   Query q=s.createQuery("from StuPersonal");

    splL=q.list();


  tx.commit();
  s.close();

    return splL;

  }

现在我必须比较两个列表,并且需要获取第二个列表中未显示的项目。即某些对象不在第2类列表中,因此需要存储它们。我写的这段代码不能正常工作。请指教。

for(StuPersonal cl:sp)

{
for(StuPersonal cl2:sp2)
        {

           if(cl.getid().equals(cl2.getid()))
            {
                //i++;
                break;
            }
            else
            {
            fun.updatelist(cl.getid());
            break;
            }

        }        
}   

3 个答案:

答案 0 :(得分:2)

您正在检查列表对象的ID而不是Class_1对象ID

 if(cl.getid() == cl2.getid())
            {
                //i++;
                break;
            } else
        {
        fun.updatelist(cl2.getid());
        break;
        }

你正在使用equals方法,考虑到id不长String

答案 1 :(得分:2)

您不是通过为变量和方法选择可怕的名称,不遵守标准命名约定,而是不正确地缩进代码来帮助自己。

无论如何,你应该尝试编写只做一件事的简短方法,它代表你任务中的步骤。您的任务是生成列表1中存在但在列表2中不存在的对象列表。此处“存在”表示“列表中存在具有相同ID的对象”。

首先编写方法isPresent()

/**
 * Returns true if an object with the same ID as the ID of the given object is
 * present in the given list
 */
private boolean isPresent(StuPersonal object, List<StuPersonal> list) {
    for (StuPersonal candidate : list) {
        if (candidate.getId().equals(object.getId()) {
            return true;
        }
    }
    return false;
}

现在您可以在算法中使用此方法:

// start with an empty list
List<StuPersonal result = new ArrayList<>();

// add every element of list1 unless it's present in list2
for (StuPersonal s : list1) {
    if (!isPresent(s, list2)) {
        result.add(s);
    }
}

答案 2 :(得分:0)

以下是针对您的方案使用String的示例。

    List<String> firstList = Arrays.asList("obj1", "obj2", "obj3");
    List<String> secondList = Arrays.asList("obj1", "obj2", "obj3", "obj4", "obj5");
    List<String> storedList = new ArrayList<String>();


    for (String obj2 : secondList) {
       if (!firstList.contains(obj2)) {
           storedList.add(obj2);
       }
    }