访问字符串中包含超过2 ^ 31个字符的字符

时间:2018-12-01 10:04:30

标签: java string char stringbuilder biginteger

我一直试图从具有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);

    }

错误

  
      
  1. 错误:找不到适合于charAt(BigInteger)的方法               c = s.charAt(Char_Counter);
  2.   
  3. 方法CharSequence.charAt(int)不适用     (参数不匹配; BigInteger无法转换为int)
  4.   
  5. 错误:不兼容的类型:StringBuilder无法转换为char               c = sb.append(c);
  6.   

1 个答案:

答案 0 :(得分:2)

java.lang.String不适合非常大的字符串。 BigInteger不适合索引大于2 ^ 31的字符串-使用long

构造字符串需要内存中已有数据,因此有两个副本。通常,在构造之前会重新调整其他缓冲区的大小,这至少需要实际数据大小的两倍以及缓冲区中的任何额外容量。

另外String个字符(通常为char,但其他字符可用)的内部存储可能不适合您的数据。另外,是否要创建一个BigInteger对象以及内部数组来访问每个索引。

即使java.nio使用int来索引其缓冲区(当前)。

因此,您将要编写由BigString索引的自己的long,并由一个数组数组作为后盾。或更可能是内存映射的NIO缓冲区的数组(或List)。