web-dev-qa-db-ja.com

doubleをint配列に変換します

ダブルがあります

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'; 

それは機能していますが、データ型間の変換の多くがエラーにつながる可能性があると思うので、このソリューションは好きではありません。私のコードは完全ですか、それとも何か他のものをチェックする必要がありますか?

そして、この問題にどのようにアプローチしますか?

28
Ian Fako

私はまっすぐな方法を知らないが、私はそれがより簡単だと思う:

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

キャストを回避したいので、正の数のみを処理する必要があると仮定すると、算術的な方法があります:

_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)で同じコードを使用することで簡単に実行できます。

浮動小数点演算のため、バイナリで完全に表現できない値については予期しない結果が得られることに注意してください。

ここ は、問題を示し、私のコードを試すことができる場所です。

14
Aaron
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
Eugene

Java 8で使用できます

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

これも動作します

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