ダブルがあります
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)
で同じコードを使用することで簡単に実行できます。
浮動小数点演算のため、バイナリで完全に表現できない値については予期しない結果が得られることに注意してください。
ここ は、問題を示し、私のコードを試すことができる場所です。
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();