Преобразование 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