第一次来这里,所以我希望这是有道理的!
我有两个对象数组,例如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。
答案 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 = 1
,j = 2
然后i != j
,即1 != 2
为真,1将插入l3。
当i = 1
,j = 3
然后i != j
,即1 != 3
为真,再次1将插入l3。
当i = 2
,j = 2
然后i != j
,即2 != 2
为假时
当i = 2
,j = 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()));
}
}