访问超过 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);

    }

错误

  1. error: no suitable method found for charAt(BigInteger) c = s.charAt(Char_Counter);
  2. method CharSequence.charAt(int) is not applicable (argument mismatch; BigInteger cannot be converted to int)
  3. 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)。