我如何比较两个列表?

时间:2017-08-24 06:18:11

标签: java

CompareList removedList = new CompareList();
CompareList addedList = new CompareList();

这就是我在

中添加元素的方法
addedList.add(new Objec("Var_a", "1"));

和Objec课有两个字符串。

我该如何比较?我不能像使用字符串的ArrayList一样使用包含吗?

在CompareList中我有

public boolean equals(CompareList l) {

    if (l.containsAll(this)) {
        if (this.containsAll(l)) {
            return true;
        }
    }
    return false;
}

和Objec

public Objec(String n, String s) {
    this.name=n;
    this.surname=s;
}

public String toString() {
    return " Name: " + name +  ", Surname: " + surname;
}

我看到许多人对我的问题感到困惑。那么我想要什么?

清单1:

Samy Joe
艾玛比
朱莉娅罗布

清单2:

Samy Joe
艾玛比
安娜天空

删除了Julia Rob并添加了Anna Sky。但是当我的列表包含有两个字符串的对象时,我不知道该怎么做?

3 个答案:

答案 0 :(得分:3)

这段代码比较列表是否相等,即包含相同的元素。

static boolean same(Collection<?> a, Collection<?> b) {
    if (a.size() != b.size()) {
        return false;
    }
    List<?> c = new ArrayList<>(a);
    c.removeAll(b);
    return c.isEmpty();
}
  • 如果尺寸不相等,则列表永远不会相等。
  • 否则,如果大小相等,那么我们知道两个列表都包含一个或多个在另一个列表中不存在的元素。因此,我们从其中一个列表中创建一个新列表(在我的案例中列出a),然后删除b的元素。

您不需要使用自己的班级CompareList,而只需使用ArrayList或其他内容。

为了将您的Objec与另一个equals(Object)进行比较,您需要正确实施hashCode()static HashMap<Collection<?>, Collection<?>> disjoints(Collection<?> a, Collection<?> b) { List<?> aa = new ArrayList<>(a); aa.removeAll(b); List<?> bb = new ArrayList<>(b); bb.removeAll(a); HashMap<Collection<?>, Collection<?>> map = new HashMap<>(); map.put(a, aa); map.put(b, bb); return map; }

如果您想知道哪个元素未包含在其他列表中,那么您可以使用:

a

它返回一个映射,其中包含两个集合的键作为键,以及由键指定的集合的元素作为值,这些元素不包含在另一个集合中。例如,如果您想知道b中不存在的disjoints(a, b).get(a)元素,请拨打List

注意:我调用列表集合,因为它们是。在Java中,Collection->select('(pol.quantity * pol.price) as actual_material_cost') ->addSelect('p.project_id') ->addSelect('pol.purchase_order_line_id') ->addSelect('ri.requisition_item_id') ->addSelect('pt.project_task_id') ->addSelect('polri.purchase_order_line_req_item_id') ->from('PurchaseOrderLines pol') ->leftJoin('pol.PurchaseOrderLineReqItems polri') ->leftJoin('polri.RequisitionItems ri') ->leftJoin('ri.ProjectTasks pt') ->leftJoin('pt.Projects p') ->where('p.project_id = ?' , $project_id); 的子类型。

答案 1 :(得分:1)

您需要覆盖自定义对象中的equals方法,如下所示:

public class MyObject {
     private String name;
     private String surname;

    @Override
    public boolean equals(MyObject myObject) {
         // assert that name and surename can not be null or check for this
         if (!this.name.equals(myObject.name)) {
             return false;
         }

         if (!this.surname.equals(myObject.surname)) {
             return false;
         }

         return true;
    }
}

包含列表的方法将使用equals方法来检查对象的相等性。

但@Prakash发布的链接是更好的方法。我想没有人理解你的注意力与你的比较列表以及为什么你使用自定义的;)

修改: 对不起,签名中有错误。

@Override
    public boolean equals(Object obj) {
        if (!(obj instanceof MyObject) {
            return false;
        }
        // else cast and use code above
    }

答案 2 :(得分:1)

你有疑问:“我该怎么比较?”

首先要记住的是,您可以通过两种方式进行比较。 所以先考虑一下。

平等: 比较平等时

  

使用equals(),当你在它时实现hashCode()。

比较/排序: 2个对象何时被认为低于,等于或高于另一个?

  

实现“Comparable”接口并覆盖compareTo。

你的帖子包含equals()所以我们说这就是你想要做的事情。 如果你想使用containsAll(),请记住它使用列表包含的类中的equals来确定返回true / false。所以你应该:

  

将equals()添加到“Objec”类。