比较两个对象arraylists

时间:2016-05-18 06:08:58

标签: java

第一次来这里,所以我希望这是有道理的!

我有两个对象数组,例如l1和l2,我想在这两个列表之间运行比较,并在l3中得到一个不匹配的值。 用户类包含2个字符串:

userEnteredValue 
valueReturnedFromDatabase

说,l1包含:Java,JSF,JAXR,foo l2包含:JSF,JAXR

我可以对匹配值进行比较,但不能用于非匹配值。逻辑似乎有缺陷。有什么帮助吗?

匹配值:

for(User u1 : l1) {
   for(User u2: l2) { 
      if(u1.getUserEnteredValue().equals(u2.getValueReturnedFromDatabase())) {
        l3.add(u1);
      }
} 

但是,对于我说不相等的非匹配,而不是只得到唯一值我获得所有值。 Stackoverflow上的几个类似帖子建议在User类中实现equals和hashcode方法。这是必要的,因为我的arraylist大小不超过5到10。

7 个答案:

答案 0 :(得分:1)

您可以使用contains()中的java.util.ArrayList方法来确定您的列表是否包含该对象。

示例:

for(User u1:l1) {
    if(!l2.contains(u1)) {
        l3.add(u1);
    }
}

答案 1 :(得分:1)

https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#contains(java.lang.Object)

遍历一个数组并使用java中ArrayList提供的上述方法检查它是否“包含()”来自其他数组的元素。

答案 2 :(得分:1)

如果你可以使用Java 8,你想要一些更短的格式:

 List<String> l1 = Arrays.asList("a", "b", "c");
 List<String> l2 = Arrays.asList("b");

 List<String> l3 = l1.stream().filter(e -> !l2.contains(e)).collect(Collectors.toList());

答案 3 :(得分:1)

您可以这样做:

for(User u1 : l1) {
    boolean unique = true;
    for(User u2: l2) { 
        if(u1.getUserEnteredValue().equals(u2.getValueReturnedFromDatabase())) {
            unique = false;
            break;
        }
    } 
    if(unique){
        l3.add(u1);
    }
}

答案 4 :(得分:0)

让我们让你的问题更小 我有2个阵列
l1 = [1,2]
l2 = [2,3]

for(int i : l1) {
    for(int j : l2) {
        if(i != j) {
            l3.add(i);
        }
    }
}

现在让我们来看看这段代码 当i = 1j = 2然后i != j,即1 != 2为真,1将插入l3。
i = 1j = 3然后i != j,即1 != 3为真,再次1将插入l3。
i = 2j = 2然后i != j,即2 != 2为假时 当i = 2j = 3然后i != j,即1 != 2为真,2将插入l3。
所以最后的数组将是l3 = [1,2](如果它是一个集合。或者[1,1,2]如果它是一个列表),即l1的所有元素都将被插入在l2。

要获得l1的唯一元素,你必须检查l1的所有元素是否为l1 1中的相同元素,如果在完整l2中找不到它,则将其添加到l3中。

rootloop:
for(int i : l1) {
    for(int j : l2) {
        if(i == j) {
            continue rootloop;
        }
        l3.add(i);
    }
}

现在更改上面的代码以解决您的问题。

但是这种搜索非常普遍,以至于它们的实现已经在集合框架中给出了。

for(int i : l1) {
    if(!l2.contains(i)){
        l3.add(i);
    }
}

答案 5 :(得分:0)

可以使用匹配实体数组来创建不匹配的实体,如下所示:

User[] matchingUsers = ...
User[] AllUsers = ...

List<User> listOfMatchingUsers = Arrays.asList(matchingUsers);
List<User> listOfAllUsers = Arrays.asList(allUsers);

List<User> unmatchedUsers = listOfAllUsers.removeAll(listOfMatchingUsers);

答案 6 :(得分:0)

我使用list.contains看到很多答案,我不同意包含使用直接循环所以性能将是大型列表O(n ^ 2)的问题。

相反,您可以使用地图,使用键将每个列表添加到地图中,然后执行以下操作:

Iterator it = map1.entrySet().iterator();
while (it.hasNext()) {
    Map.Entry pair = (Map.Entry)it.next();
    if(map2.get(pair.getValue())!=null) {
            list3.add(map2.get(pair.getValue()));
     }
}