【问题标题】:Attempting to compare two arrays with Arrays.contains Java [duplicate]尝试使用 Arrays.contains Java 比较两个数组 [重复]
【发布时间】:2017-04-14 06:47:18
【问题描述】:

我正在尝试查看我的数组中的元素是否包含在我的其他数组之一中。我不想为此使用嵌套的 for 循环,我很好奇为什么我的 .contains 不起作用。

目前我有两个数组

double [] s2 = new double [4];
double [] match = new double [s2.length];

我正在尝试测试s2 是否包含我的match 数组中的任何值

for (j = 0; j < s2.length; j++) 
        {
            if(Arrays.asList(s2).contains(match[j])){
                return true;
            }
       }

这与我使用的双精度数据类型有关吗?如果是这样,有没有办法我仍然可以使用.contains

【问题讨论】:

  • 您不想使用嵌套循环的任何具体原因?
  • 正在使用嵌套循环,您只是通过contains 间接使用(并且您在每次传递时为s2 创建一个新的列表包装器) .
  • 有趣的是我现在不知道@chrylis,所以这会给我一个运行时间 O(n^2) 吗?因为它现在将是一个运行 n 次的嵌套循环。
  • 您想检查s2 中的any 元素是否在match 中?还有其他一些具有更好大 O 的替代方案,例如先排序一个,但通常会降低常数,而只支持循环两次。

标签: java arrays contains


【解决方案1】:

问题是Arrays.asList(s2) 没有像您期望的那样返回List&lt;Double&gt; 对象。

它返回一个List&lt;double[]&gt; 对象。因此,该数组中的元素将是 double[] 类型。

泛型不适用于原始类型。

解决方案是将double[] 转换为Double[] 某处。

【讨论】:

  • 作为解决方案,用户应该使用Arrays.&lt;Double&gt;asList
  • @Unihedron 不起作用。 asList 不会以这种方式接受double[]。编译错误:)
  • 啊,你是对的,我认为参数会适应是错误的。我的错!
【解决方案2】:

解决具体问题:Arrays.asList 不会创建元素的 List,而是仅创建一个值的 List:元素的 double[](在索引 0 处)。您应该自己遍历列表进行第二次for 循环,而不是创建不同的对象。


这可以通过Stream 操作 () 而不是使用循环来完成,尽管差异应该很小。

DoubleStream.of(s2)      // Pipe the source array
    .distinct()          // Remove duplicate elements
                         // as they only need to be matched against once
    .anyMatch(value ->   // Consider if any value matches this condition
        IntStream.of(match)  // It equals any value in "match"
                 .distinct() // after removing duplicate elements
                 .anyMatch(matchValue -> matchValue == value));

有关流的更多信息 - 请参阅这些 Oracle 文章:使用 Java SE 8 流处理数据Part 1Part 2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    相关资源
    最近更新 更多