Преобразование double в int array

У меня есть двойной

double pi = 3.1415;

Я хочу преобразовать это в массив int

int[] piArray = {3,1,4,1,5};

Я придумал это

double pi = 3.1415;
String piString = Double.toString(pi).replace(".", "");
int[] piArray = new int[piString.length()];
for (int i = 0; i <= piString.length()-1; i++)
   piArray[i] = piString.charAt(i) - '0'; 

Это работает, но мне не нравится это решение, потому что я думаю, что много конверсий между типами данных может привести к ошибкам. Является ли мой код даже полным или мне нужно проверить что-то еще?

И как бы вы подошли к этой проблеме?

Ответ 1

Я не знаю прямо, но я думаю, что это проще:

int[] piArray = String.valueOf(pi)
                      .replaceAll("\\D", "")
                      .chars()
                      .map(Character::getNumericValue)
                      .toArray();

Ответ 2

Поскольку вы хотите избежать бросков, здесь арифметический способ, предполагающий, что вам нужно иметь дело только с положительными цифрами:

List<Integer> piList = new ArrayList<>();
double current = pi;
while (current > 0) {
    int mostSignificantDigit = (int) current;
    piList.add(mostSignificantDigit);
    current = (current - mostSignificantDigit) * 10;
}

Обработка отрицательных чисел может быть легко выполнена путем проверки знака сначала, используя тот же код с current = Math.abs(pi).

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

Вот идеон, который иллюстрирует проблему и где вы можете попробовать мой код.

Ответ 3

int[] result = Stream.of(pi)
            .map(String::valueOf)
            .flatMap(x -> Arrays.stream(x.split("\\.|")))
            .filter(x -> !x.isEmpty())
            .mapToInt(Integer::valueOf)
            .toArray();

Или более безопасный подход с java-9:

 int[] result = new Scanner(String.valueOf(pi))
            .findAll(Pattern.compile("\\d"))
            .map(MatchResult::group)
            .mapToInt(Integer::valueOf)
            .toArray();

Ответ 4

Вы можете использовать в java 8

int[] piArray = piString.chars().map(Character::getNumericValue).toArray();

Ответ 5

это будет работать также

int[] piArray = piString.chars().map(c -> c-'0').toArray();

Ответ 6

Это решение не делает никаких предположений и использует строковые манипуляции, чтобы получить нужный результат. Получает double, превращает его в строку, удаляет недопустимые символы, затем отбрасывает каждый из оставшихся символов в int и сохраняет их в массиве - в том порядке, в котором они появляются в двойном

        double pi           = 3.1415;
        String temp         = ""+ pi;
        String str          = "";
        String validChars   = "0123456789";

        //this removes all non digit characters 
        //so '.' and '+' and '-' same as string replace(this withThat)
        for(int i =0; i<temp.length(); i++){
          if(validChars.indexOf(temp.charAt(i)) > -1 ){
              str = str +temp.charAt(i);
          }
        }

        int[] result = new int[str.length()];

        for(int i =0; i<str.length(); i++){
          result[i] = Integer.parseInt(""+str.charAt(i));
          System.out.print(result[i]);
        }

        return result; //your array of ints