我有一个双
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';
它工作但我不喜欢这个解决方案,因为我认为数据类型之间的大量转换可能会导致错误。我的代码是否完整或是否需要检查其他内容?
那你怎么解决这个问题呢?
我不知道直道,但我觉得它更简单:
int[] piArray = String.valueOf(pi)
.replaceAll("\\D", "")
.chars()
.map(Character::getNumericValue)
.toArray();
既然你想避免强制转换,这里是算术方式,假设你只需要处理正数:
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)
相同的代码轻松完成。
请注意,由于浮点算术,它将为您提供无法用二进制表示的值的结果。
Here是一个说明问题的地方,你可以尝试我的代码。
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();
你可以在java 8中使用
int[] piArray = piString.chars().map(Character::getNumericValue).toArray();
这也行
int[] piArray = piString.chars().map(c -> c-'0').toArray();
此解决方案不做任何假设,并使用字符串操作来获得您想要的结果。获取double,将其转换为字符串,删除非法字符,然后将每个剩余字符转换为整数并将它们存储在数组中 - 按照它们出现在double中的顺序
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