Доступ к символу в строке, содержащей более 2 ^ 31 символов - PullRequest
0 голосов
/ 01 декабря 2018

Я пытался получить доступ к символам из строки, содержащей 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. ошибка: не найден подходящий метод для charAt (BigInteger) c = s.charAt (Char_Counter);
  2. метод CharSequence.charAt (int) не применим (несоответствие аргумента; BigInteger не может быть преобразован в int)
  3. ошибка: несовместимые типы: StringBuilderне может быть преобразовано в символ c = sb.append (c);

1 Ответ

0 голосов
/ 01 декабря 2018

java.lang.String не подходит для очень больших строк.BigInteger не подходит для индексации строк размером более 2 ^ 31 - используйте long.

Для построения строки требуются данные, уже находящиеся в памяти, поэтому две копии.Размер дополнительных буферов, как правило, будет изменен перед созданием, для чего требуется как минимум вдвое больше фактического размера данных плюс дополнительная емкость в буфере.

Кроме того, внутреннее хранилище String символов (обычно char, но другиедоступно) может не подходить для ваших данных.Кроме того, вы хотите создать объект BigInteger вместе с внутренним массивом для доступа к каждому индексу.

Даже java.nio использует int для индексации своих буферов (в настоящее время).

Таким образом, вы захотите написать свой собственный BigString с индексом long, подкрепленный массивом массивов.Или, скорее, массив (или List) отображенных в память буферов NIO.

...