java - 有效比较两个 ArrayList 的内容

标签 java arraylist collections

知道为什么contains在这里不起作用,这些语句总是评估falsefirstSchema.contains(firstSchema.get(0))

    List<String> firstSchema = new ArrayList<String>();
    firstSchema.add(0,"test");
    firstSchema.add(1,"testy");

    if(!(firstSchema.contains(firstSchema))){
        System.out.println("hey arraylist content matched");
    }

如果一个数组列表中的任何一个或多个或所有元素与其他数组列表元素匹配,我需要得到 true

最佳答案

检查一个列表是否包含另一个列表中的任何元素的最简单方法是调用 contains()在其中一个列表上,依次传递每个元素作为参数。像这样的东西:

public <E> boolean slowListContains(List<E> a, List<E> b) {
  for (E element : a) {
    if (b.contains(element)) {
      return true;
    }
  }
  return false;
}

但是,这很慢,因为 contains() 是一个线性运算 (O(n)),而且由于我们在循环中调用它,slowListContains() 函数需要二次时间 (O(n^2)),这很差。我们可以做得更好。

一个Set (或更准确地说,基于散列的集合,例如 HashSet )具有高效的 contains() 方法,该方法在低于线性的时间内运行(在 HashSet< 的情况下为恒定时间)/)。将一个或另一个列表转换为 Set 将使 slowListContains() 中的循环更快。像这样的东西:

public <E> boolean fasterListContains(List<E> a, List<E> b) {
  Set<E> aSet = new HashSet<>();
  aSet.addAll(a);
  for (E element : b) {
    if (aSet.contains(b)) {
      return true;
    }
  }
  return false;
}

这并不完美,但它肯定比简单的解决方案快得多。一个小小的改进是始终将较小的列表转换为 Set,而不是第一个列表。您还可以采用任意 Iterable 参数而不是 List 参数,然后检查它们中的任何一个是否已经是 Set ,如果是,则跳过 set-施工步骤。

关于java - 有效比较两个 ArrayList 的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40254603/

相关文章:

java - Android Imageview 上的大图像因 OOM 错误导致应用程序崩溃

java - 覆盖来自外部库的 bean

.net - 匿名类型集合?

c# - 使用 LINQ 将数据从一个列表复制到另一个列表

java - double 失败 - 无法使用大十进制

java - 带空格的速度文本输入

Java初始化二维数组列表

Java ArrayList.clear() 函数

java - 在我的代码中使 arraylist 可打包?

java - HashSet 与 ArrayList