我一直试图从具有1万亿个字符的字符串中访问字符。我正在使用BigInteger从字符串中获取索引号,并使用charAt方法来从String中访问字符。
我想做的是计算给定String中特定字符的出现。
例如,字符串:aaaaaaa
... 最多1万亿个字符“ a” 。然后我将计算字符“ a”(要计数的给定字符)的出现次数
如何从超过2,147,483,647(2 ^ 31)的字符串中访问字符?还有其他方法吗?
BigInteger String_Length = BigInteger.valueOf(n); //1,000,000,000,000
BigInteger Occurence = BigInteger.valueOf(0);
StringBuilder sb = new StringBuilder();
char c;
for(BigInteger First_Counter = BigInteger.valueOf(0); First_Counter.compareTo(String_Length) <= 0; First_Counter = First_Counter.add(BigInteger.ONE)){
for(BigInteger Char_Counter = BigInteger.valueOf(0); Char_Counter.compareTo(String_Length) <= 0; Char_Counter = Char_Counter.add(BigInteger.ONE)){
c = s.charAt(Char_Counter);
c = sb.append(c);
}
}
for(BigInteger Second_Counter = BigInteger.valueOf(0); Second_Counter.compareTo(String_Length) <= 0; Second_Counter = Second_Counter.add(BigInteger.ONE)){
c = sb.charAt(Second_Counter);
if(c == 'a')
Occurence = Occurence.add(BigInteger.ONE);
}
- 错误:找不到适合于charAt(BigInteger)的方法 c = s.charAt(Char_Counter);
- 方法CharSequence.charAt(int)不适用 (参数不匹配; BigInteger无法转换为int)
- 错误:不兼容的类型:StringBuilder无法转换为char c = sb.append(c);
答案 0 :(得分:2)
java.lang.String
不适合非常大的字符串。 BigInteger
不适合索引大于2 ^ 31的字符串-使用long
。
构造字符串需要内存中已有数据,因此有两个副本。通常,在构造之前会重新调整其他缓冲区的大小,这至少需要实际数据大小的两倍以及缓冲区中的任何额外容量。
另外String
个字符(通常为char
,但其他字符可用)的内部存储可能不适合您的数据。另外,是否要创建一个BigInteger
对象以及内部数组来访问每个索引。
即使java.nio
使用int
来索引其缓冲区(当前)。
因此,您将要编写由BigString
索引的自己的long
,并由一个数组数组作为后盾。或更可能是内存映射的NIO缓冲区的数组(或List
)。