【发布时间】:2023-04-04 21:48:33
【问题描述】:
我正在更新我的 Java 知识,并在代码战中进行练习。问题是如果元素“相同”,则比较两个数组。 “相同”的意思是'b'中的元素是'a'中的元素的平方,无论顺序如何。我试图做的解决方案是获取“b”中元素的平方根,并使用 Math.sqrt() 检查它是否存在于元素“a”中。但是,当我将它用作 contains() 的参数时,它总是返回 false。
为了检查元素“b”的平方根是否确实存在于“a”中,我尝试了一个简单的 if-else 来检查特定元素。但是当我将它与 Math.sqrt() 合并时,问题就出现了。
这是集合 a 和 b 的元素
int[] a = {121, 144, 19, 161, 19, 144, 19, 11};
int[] b = {121, 14641, 20736, 361, 25921, 361, 20736, 361};
我已转换为列表
List<Integer> setAList = Arrays.stream(setA)//int[] setA - parameter of a function
.boxed()
.collect(Collectors.toList());
List<Integer> setBList = Arrays.stream(setB)//int[] setB - parameter of a function
.boxed()
.collect(Collectors.toList());
我将数组转换为 List 以利用 contains() 方法。 这是我尝试检查特定元素时的代码
double sqrd = Math.sqrt(setBList.get(6));
return setAList.get(5) == sqrd ? true : false;
这给出了预期的结果 - 是的。 现在这是我将它合并到 for 循环时的代码
boolean same = true;
for(int indexB : setB) {
same = setAList.contains(Math.sqrt(indexB)) ? true : false;
System.out.println(Math.sqrt(indexB) + " " + same);
}
结果如下
11.0 false
121.0 false
144.0 false
19.0 false
161.0 false
19.0 false
144.0 false
19.0 false
false
起初我虽然问题可能是因为数据类型,但我尝试将 double 转换为 int,但我仍然得到相同的结果。
【问题讨论】:
-
您的列表包含整数,您正在检查它是否包含双精度数,当然没有。
-
附带说明,将
a中的元素平方并检查它们是否在b中会更容易(使用乘法,而不是 Math.pow 方法,这样你只处理整数)。 -
是的@Bentaye,这是我现在的第二个选择。我将不得不放弃正在转换为 List 的 int[],并使用“传统”for 循环对其进行操作。
-
@iamLinker 实际上我刚刚放弃了一个答案,展示了如何使用流来做到这一点,见下文
-
查找 exact 浮点值,就像在
contains()中所做的那样,由于浮点值的精度有限,大多数情况下是个坏主意;您可以自己尝试一下,看看Math.sqrt( number ) * Math.sqrt( number )与number的哪些数字不同。
标签: java arraylist contains math.sqrt