访问超过 2^31 个字符的字符串中的字符
Access a character in a string that has more than 2^31 characters
我一直在尝试访问具有 1 万亿个字符的字符串中的字符。我正在使用 BigInteger 从字符串中获取索引号,并使用 charAt 方法从字符串中访问字符。
我想做的是计算给定字符串中特定字符的出现次数。
例如,字符串: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);
}
错误
- error: no suitable method found for charAt(BigInteger)
c = s.charAt(Char_Counter);
- method CharSequence.charAt(int) is not applicable
(argument mismatch; BigInteger cannot be converted to int)
- error: incompatible types: StringBuilder cannot be converted to char
c = sb.append(c);
java.lang.String
不适用于非常大的字符串。 BigInteger
不是索引大于 2^31 的字符串的合适类型 - 使用 long
.
构造字符串需要内存中已有的数据,所以要复制两份。更多的缓冲区通常会在构建之前调整大小,这至少需要实际数据大小的两倍加上缓冲区中的任何额外容量。
此外,String
个字符的内部存储(通常为 char
个字符,但也有其他字符可用)可能不适合您的数据。另外,你想创建一个 BigInteger
对象和内部数组来访问每个索引吗?
甚至 java.nio
使用 int
索引其缓冲区(当前)。
因此您需要编写自己的 BigString
索引 long
,并由数组数组支持。或者更可能是内存映射 NIO 缓冲区数组(或 List
)。
我一直在尝试访问具有 1 万亿个字符的字符串中的字符。我正在使用 BigInteger 从字符串中获取索引号,并使用 charAt 方法从字符串中访问字符。
我想做的是计算给定字符串中特定字符的出现次数。
例如,字符串: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);
}
错误
- error: no suitable method found for charAt(BigInteger) c = s.charAt(Char_Counter);
- method CharSequence.charAt(int) is not applicable (argument mismatch; BigInteger cannot be converted to int)
- error: incompatible types: StringBuilder cannot be converted to char c = sb.append(c);
java.lang.String
不适用于非常大的字符串。 BigInteger
不是索引大于 2^31 的字符串的合适类型 - 使用 long
.
构造字符串需要内存中已有的数据,所以要复制两份。更多的缓冲区通常会在构建之前调整大小,这至少需要实际数据大小的两倍加上缓冲区中的任何额外容量。
此外,String
个字符的内部存储(通常为 char
个字符,但也有其他字符可用)可能不适合您的数据。另外,你想创建一个 BigInteger
对象和内部数组来访问每个索引吗?
甚至 java.nio
使用 int
索引其缓冲区(当前)。
因此您需要编写自己的 BigString
索引 long
,并由数组数组支持。或者更可能是内存映射 NIO 缓冲区数组(或 List
)。