我从返回List <Integer>
的数据库中提取数据值。但是,我想看看List是否包含我的BigInteger。有一种简单的方法可以做到这一点吗?
我目前在Java中有以下代码:
ArrayList<Integer> arr = new ArrayList<Integer>() {{add(new Integer(29415));}};
boolean contains = arr.contains(29415); // true
boolean contains2 = arr.contains(new BigInteger("29415")); // false
我不确定这样做的有效方法吗?
答案 0 :(得分:5)
评估以下内容将返回正确答案:
val != null
&& BigInteger.valueOf(Integer.MIN_VALUE).compareTo(val) < 0
&& BigInteger.valueOf(Integer.MAX_VALUE).compareTo(val) > 0
&& list.contains(val.intValue())
这将正确解决BigInteger
中List<Integer>
是否“包含”的问题。请注意,这里我们只在必要时向下转发。如果val
超出Integer
值的范围,则无需向下转换,因为我们知道值不能在列表中。
一个更相关的问题是,您是否应该使用List<BigInteger>
代替List<Integer>
,但这是一个不同的问题,而不是您明确问题的答案的一部分
答案 1 :(得分:3)
虽然arshajii提供了一个有效的解决方案,但我会反对它。 你永远不应该低估价值观。您正在运行您的程序产生较大值的危险,这些值在下载时会转换为无效值。几个月之后,这种错误对于排除故障是非常讨厌的。
如果您的代码适用于BigInteger,那么您应该将数据库中的所有值转换为BigInteger。这是一个你不能放松价值的上流。 总的来说,我会重视效率的正确性。如果有的话,我会重新考虑你对BigInteger的使用(也许很长很好?)但是因为你有它,我认为你有理由。
答案 2 :(得分:2)
在Java List.contains()
内部使用equals()
方法,因为BigInteger.equals(Integer)
返回false,您的List.contains()
也会返回false。使用an List<BigInteger>
或从BigInteger中提取Int值(如arshajii所解释的!)。当然,如果你真的想要有效地搜索,你应该考虑二进制搜索(在排序列表中)或其他数据结构,如Map
。
答案 3 :(得分:1)
您可以尝试使用BigInteger#intValue()
:
arr.contains(myBigInteger.intValue())
但请注意,如果myBigInteger
太大而无法放入int
,则只返回低32位(如链接文档中所述)。因此,您可能需要在检查包含之前检查myBigInteger
是否小于或等于Integer.MAX_VALUE
。