Java 在大值中使用哪种数据结构?

Java 在大值中使用哪种数据结构?,java,text,data-structures,mapreduce,bitset,Java,Text,Data Structures,Mapreduce,Bitset,我正在用mapreduce写一个程序。我需要为每个键保存一个较大的值。对于每个id(键),我想保存一个由大数字组成的值。我使用了从1到100000000的数字。例如: id value 1 1,3,9,23,56,345,.......,10000000000 2 6,8,45,321,876,.........,98760000876 . . . 100000000 1,2,6.83,90,126,567,.......,7632786765643

我正在用mapreduce写一个程序。我需要为每个键保存一个较大的值。对于每个id(键),我想保存一个由大数字组成的值。我使用了从1到100000000的数字。例如:

id       value
1        1,3,9,23,56,345,.......,10000000000
2        6,8,45,321,876,.........,98760000876
.
.
.
100000000   1,2,6.83,90,126,567,.......,7632786765643
在每次迭代中,每个值中的数字量都会增加。首先,我选择文本类型作为值,但在结果中,我看到洗牌大小变得非常大,我无法得到答案。然后我选择了
BitSet
类型,但是BitSet的处理速度非常慢。我不知道我可以使用哪种数据结构来提供大小和处理速度。有人能帮我吗?
谢谢。

我想您可以为每个键关联一个
列表。因此,您可以使用将ID与数字列表关联的
Map
:在Java中,int数据类型是32位有符号整数。它的范围为-2147483648到2147483647,这在您的情况下是不够的。如果您有64位计算机,则可以使用“int”类型

否则,您可以使用

对我来说,合适的数据结构是:

Map<Integer, List<BigInteger>>
Map

你可以使用@AurA:Cn biginger保存很多数字吗?对于每个数字,它需要多少空间?它快吗?biginteger比bitset好吗?它快吗?BigInteger上的常规操作(加、减、乘、除)当然比相应的基本类型慢,因为它在内存中使用的大小很大。BigInteger也是不可变的。所以每一个操作都会创建一个新的实例,这对于你必须要做的操作是非常重要的。由于你想要操纵的数字的大小,我会考虑从32位移动到一个64位的机器,在这里你可以简单地使用“int”来表示从922337203685477580到922337203685477580的数字。哪一个更好?长数组还是长列表?在Java中使用数组是个坏主意。您可以改为使用
ArrayList
(O(1)中的随机访问)。但是如果您想保持数字的顺序,请使用
链接列表
。列表更好还是设置?为什么数组是个坏主意?ArrayList有哪些数组没有的优点?数组是一个静态结构:你不能轻易地“动态”改变它的大小。
ArrayList
是一个对象,如果添加元素,其大小将自动增长。此外,在
ArrayList
上有许多方法可以对其进行操作,如
contains()
remove()
。。。