当我只有BigInteger?</integer>时,如何使用ArrayList <integer> #contains

时间:2014-04-14 13:55:52

标签: java types contains biginteger

我从返回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

我不确定这样做的有效方法吗?

4 个答案:

答案 0 :(得分:5)

评估以下内容将返回正确答案:

val != null 
  && BigInteger.valueOf(Integer.MIN_VALUE).compareTo(val) < 0 
  && BigInteger.valueOf(Integer.MAX_VALUE).compareTo(val) > 0 
  && list.contains(val.intValue())

这将正确解决BigIntegerList<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