【问题标题】:How do I use ArrayList<Integer>#contains when I only have a BigInteger?当我只有一个 BigInteger 时,如何使用 ArrayList<Integer>#contains?
【发布时间】:2014-04-14 13:55:52
【问题描述】:

我正在从返回&lt;Integer&gt; 列表的数据库中提取数据值。但是,我想看看列表是否包含我的 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

我不确定是否有有效的方法来做到这一点?

【问题讨论】:

  • 取决于您所说的“高效”。 ArrayList.contains 只是对其元素进行线性搜索。如果你想efficient 搜索,你需要考虑一些其他的结构,例如,一个散列的结构。
  • 高效,我的意思是:有没有办法得到一个正确的解决方案,而不必强制转换 'arr' 来持有

标签: java types contains biginteger


【解决方案1】:

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

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

这将正确解决您拥有的BigInteger 是否“包含”在List&lt;Integer&gt; 中的问题。请注意,这里我们只在必要时向下转换。如果val 超出Integer 值的范围,则无需向下转换,因为我们知道值不能在列表中。

一个更相关的问题是您是否真的应该使用List&lt;BigInteger&gt; 代替List&lt;Integer&gt;,但这是一个不同的问题,不是您明确问题答案的一部分

【讨论】:

    【解决方案2】:

    虽然 arshajii 提供了一个可行的解决方案,但我会投反对票。 你永远不应该贬低价值观。您正在运行程序产生较大值的危险,这些值在向下转换时会转换为无效值。这种错误会在几个月后排除故障。

    如果您的代码使用 BigInteger,那么您应该将数据库中的所有值转换为 BigInteger。这是一个向上的转变,你不能失去价值。 总的来说,我会重视正确性而不是效率。如果有的话,我会重新考虑你对 BigInteger 的使用(也许 long 很好?)但是因为你有它,我认为你有它的理由。

    【讨论】:

      【解决方案3】:

      在 Java 中 List.contains() 在内部使用 equals() 方法,因为 BigInteger.equals(Integer) 返回 false,所以您的 List.contains() 也返回 false。使用 List&lt;BigInteger&gt; 或从 BigInteger 中提取 Int 值(如 arshajii 解释的那样!)。当然,如果你真的想有效地搜索,你应该考虑二分搜索(在排序列表中)或者像Map这样的其他数据结构。

      【讨论】:

      • 反对者,想发表评论吗? PS:只要反对票仍然存在,这个问题就会一直存在。
      • +1 因为该观点确实有效,并且没有理由被否决。
      • 我投了反对票,因为我没有控制权投给 BigInteger(除非我明确地这样做)......但你是对的,编辑你的答案,我会投赞成票。
      • @Kamilski81 完成:更新了我的答案。也适用于未来:一个糟糕的问题/不完整的问题应该与涵盖多个用例的答案无关。
      【解决方案4】:

      你可以试试BigInteger#intValue():

      arr.contains(myBigInteger.intValue())
      

      但是请注意,如果 myBigInteger 太大而无法放入 int,则只会返回低 32 位(如链接文档中所述)。因此,您可能需要在检查是否包含之前检查 myBigInteger 是否小于或等于 Integer.MAX_VALUE

      【讨论】:

      • 但不要忘记确保您的 BigInteger 永远不会包含任何大于 int 的数字。
      猜你喜欢
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-11
      • 2011-05-09
      相关资源
      最近更新 更多