Java 大整数 - 嵌套获取
Java Big Integer - Nested get
我在使用 BigInteger
class 时遇到问题。我有一个只有普通 int
s 的输入列表,但我不得不更改 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) 添加新的。
我在使用 BigInteger
class 时遇到问题。我有一个只有普通 int
s 的输入列表,但我不得不更改 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) 添加新的。