Как преобразовать массив символов, содержащий двойное значение, в двойную переменную, БЕЗ создания накладных расходов на объект String? - PullRequest
0 голосов
/ 18 марта 2019

Мой вопрос соответствует этому , но мне нужно сделать это без дополнительных затрат.

Собственный parseDouble() в Java принимает строку, но моя ситуация дает мне буфер сырой памяти, к которой я могу получить доступ через buf.getByte(int position). Так как мой сценарий использования обрабатывает сотни тысяч таких двойников за раз, неуклюже и медленно создается новая строка для каждого.

Следовательно, мне нужен способ перехода от представления байта типа double (буфер содержит символы / байты, представляющие {'1' '1' '.' '1'} для 11.1) до типа Double, без создания дополнительных объектов. при этом в куче.

Любая помощь будет оценена! Спасибо.

Ответы [ 2 ]

1 голос
/ 18 марта 2019

Грубый, хакерский и не будет работать с негативами, но вы можете сделать работу, чтобы укрепить его:

private static double toDouble(byte[] bs) {
    boolean onLeft = true;
    double left = 0;
    double right = 0;

    for (byte b : bs) {
        if (b == '.') {
            onLeft = false;
        } else if (onLeft) {
            left *= 10;
            left += b - '0';
        } else {
            right += b - '0';
            right /= 10;
        }
    }

    return left + right;
}

И:

 System.out.println(toDouble(new byte[] { '1', '1', '.', '1' }));

Урожайность 11,1.

0 голосов
/ 19 марта 2019

Что-то в строках другого ответа,

public static double arr2double(char[] arr) {
double num = 0;
double num2 = 0;
int idForDot=arr.length;
boolean isNeg = false;
char[] st =  null;
int start = 0;
int end = arr.length;
boolean hasDot=false;

if (arr[0] == '-') {
    isNeg = true;
    start++;
} else if (arr[0] == '+') 
    start++;

for(int i = start; i < arr.length; i++)
  if (arr[i] == '.') {
      hasDot=true;
      idForDot=i;
      for (int j = arr.length - 1; j >= idForDot + 1; j--)
          num2 = (num2 + arr[j] - '0') / 10;
      break;
  } 

  if (hasDot)
    st = Arrays.copyOfRange(arr, 0, idForDot);
  else 
      st = arr;

for (int i = start; i < st.length; i++) {
    if (st[i] == ',')
        continue;
    num *= 10;
    num += st[i] - '0';
}
num = num + num2;
if (isNeg)
    num = -1 * num;

return num;

}

...