1

我需要检查一个数组列表中的任何值是否存在于另一个数组列表中:

import java.util.ArrayList;

public class SampleCode {

    ArrayList<Integer> in = new ArrayList<>();
    ArrayList<Integer> is = new ArrayList<>();
    public static void main(String[] args) {
        new SampleCode().work();
    }
    public void work(){
        in.add(3);in.add(4);in.add(5);
        is.add(1);is.add(2);is.add(3);
        if(is.containsAll(in)){
            System.out.println("It does not contain");
        }
    }
}

它打印“它不包含”。我需要知道是否有办法比较这两个数组列表,如果另一个数组列表中存在任何值,它应该返回false. 我知道迭代可以提供帮助。有什么简单的方法可以做到这一点吗?

4

6 回答 6

7

我认为你可以使用

Collections.disjoint

它说

Returns true if the two specified collections have no elements in common.

因此,如果有任何共同元素,它将返回 false。

于 2013-10-25T13:17:05.863 回答
1

试试这个

public void work(){
        in.add(3);in.add(4);in.add(5);;
        is.add(1);is.add(2);is.add(3);;
        ArrayList<Integer> matched = new ArrayList<Integer>(in);
        matched.retainAll(is);
        if(matched.size()>0){
            System.out.println(matched);
        }else{
            System.out.println("It does not contain");
        }
    }
于 2013-10-25T13:19:50.743 回答
1
   Collection.indexOfSubList(List<?> source, List<?> target)

返回指定源列表中指定目标列表第一次出现的起始位置,如果没有出现,则返回 -1。

更正式地说,返回满足 source.subList(i, i+target.size()).equals(target) 的最低索引 i,如果没有这样的索引,则返回 -1。(如果 target.size() > source.size() 则返回 -1。)此实现使用扫描源列表的“蛮力”技术,依次在每个位置寻找与目标的匹配。

Collections.disjoint(Collection<?> c1, Collection<?> c2)

如果两个指定的集合没有共同的元素,则返回 true。

如果将此方法用于不符合收集总合同的收集,则必须小心。实现可以选择迭代任一集合并测试另一个集合中的包含(或执行任何等效计算)。如果任一集合使用非标准相等测试(如排序与 equals 不兼容的 SortedSet 或 IdentityHashMap 的键集),则两个集合必须使用相同的非标准相等测试,否则此方法的结果未定义。在使用对它们可能包含的元素有限制的集合时,还必须小心。允许集合实现为涉及他们认为不合格的元素的任何操作抛出异常。为了绝对安全,指定的集合应仅包含对两个集合都符合条件的元素。请注意,允许在两个参数中传递相同的集合,在这种情况下,当且仅当集合为空时,该方法才会返回 true。

抛出

NullPointerException- 如果一个集合包含一个 null 元素并且 null 不是另一个集合的合格元素。(可选)NullPointerException - 如果一个集合包含一个 null 元素并且 null 不是另一个集合的合格元素。(可选)ClassCastException - 如果一个集合包含的元素的类型不适用于另一个集合。(可选的)

于 2013-10-25T13:22:01.110 回答
1

另一种可能的解决方案:

public static boolean containsNone(List<?> list, List<?> of) {
    List<?> temp = new ArrayList<Object>(list);
    temp.retainAll(of);
    return temp.isEmpty();
}

例如:

List<String> ref = Arrays.asList("w1", "w2", "w3");
List<String> ok = Arrays.asList("w4", "w5");
List<String> ko = Arrays.asList("w1", "w5");
System.out.println(containsNone(ok, ref));
System.out.println(containsNone(ko, ref));

印刷:

true
false
于 2013-10-25T13:23:59.027 回答
0
Collections.disjoint(list1, list2);

是你的答案

请参阅集合文档

于 2013-10-25T13:17:57.203 回答
0
public boolean isListNotOverlapping(List<Integer> yourList1, List<Integer> yourList2) {
    for(Integer i : yourList1) {
         if (yourList2.contains(i)) {
             return false;
         }
    }
    return true;
}
于 2013-10-25T13:20:56.260 回答