Java 大整数 - 嵌套获取

Java Big Integer - Nested get

我在使用 BigInteger class 时遇到问题。我有一个只有普通 ints 的输入列表,但我不得不更改 said to 列表以也接受大整数。

在我的代码的多个部分中,我都有这样的说明:

input.set(input.get(i + 3), 
        (input.get(input.get(i + 1)) + input.get(input.get(i + 2))));

他们会产生这样的错误:

Cannot convert type of expression  
    (input.get(input.get(i + 1)) + input.get(input.get(i + 2))) from int to E  

我试过这样做:

(input.get(BigInteger.valueOf(input.get(i + 1)))
    .add(BigInteger.valueOf(input.get(BigInteger(input.get(i + 2)))))));

但这并没有帮助。

这是行不通的。您正在尝试调用 List.get(int) 并将 BigInteger(通过调用 input.get(i + 1) 获得)作为参数传递。由于 BigInteger 可以存储比 int 可以表示的大得多的数字,因此无法将一个转换为另一个。

你将不得不重新考虑你的数据结构以及你想用它们做什么。

您可以编写自己的方法来搜索 List<BigInteger> 并找到 String 值,因为存在构造函数 new BigInteger(String value)。您可以通过流式传输列表找到该值:

public static BigInteger findIn(List<BigInteger> source, String value) {
    return source.stream()
            .filter(bi -> bi.equals(new BigInteger(String.valueOf(value))))
            .findFirst()
            .orElse(null);
}

这假设要搜索的值预先转换为Strings

为什么要 String

这已经在@Amongalen 给出的答案中进行了解释:
(..) BigInteger 可以存储比 int.
更大的数字 这意味着您可能必须传递一个无法存储在 int 变量中的值。

您可以按如下方式使用:

public static void main(String[] args) {
    // provide some sample data
    List<BigInteger> bigInts = new ArrayList<>();
    bigInts.add(new BigInteger("123456789101112"));
    bigInts.add(new BigInteger("123456789101113"));
    bigInts.add(new BigInteger("123456789101114"));
    bigInts.add(new BigInteger("123456789101115"));
    bigInts.add(new BigInteger("54"));

    // provide a variable for the expression
    int i = 51;
    // convert your expression to String
    BigInteger n = findIn(bigInts, String.valueOf(3 + i));

    System.out.println(n.toString());
}

输出只是 54.

请注意,您不能简单地 add 现有 BigInteger 的值并期望它发生变化,因为算术运算不会改变现有实例,但 return是一个新的:

From JavaDocs:

public BigInteger add(BigInteger val)

Returns a BigInteger whose value is (this + val).

结论
你必须
(1) 查找列表中的值,
(2) 执行算术运算并存储return值,
(3) 从列表中删除旧值并
(4) 添加新的。