wake-up-neo.com

Konvertieren Sie double in int array

Ich habe ein Doppel 

double pi = 3.1415;

Ich möchte dies in ein int-Array konvertieren

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

Ich habe mir das ausgedacht

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

Es funktioniert, aber ich mag diese Lösung nicht, da viele Konvertierungen zwischen Datentypen zu Fehlern führen können. Ist mein Code überhaupt vollständig oder muss ich nach etwas anderem suchen?

Und wie würden Sie dieses Problem angehen?

28
Ian Fako

Ich weiß es nicht direkt, aber ich denke es ist einfacher:

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

Da Sie Casts vermeiden möchten, ist hier der arithmetische Weg, vorausgesetzt, Sie müssen sich nur mit positiven Zahlen befassen:

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

Der Umgang mit negativen Zahlen kann leicht durchgeführt werden, indem zuerst das Zeichen überprüft und dann derselbe Code mit current = Math.abs(pi) verwendet wird.

Beachten Sie, dass Sie aufgrund von Fließkomma-Arithmetik Ergebnisse erhalten, die Sie möglicherweise nicht für Werte erwarten, die nicht perfekt binär dargestellt werden können.

Hier ist eine Ideone, die das Problem veranschaulicht und wo Sie meinen Code ausprobieren können.

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

Oder sicherer mit Java-9:

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

Sie können in Java 8 verwenden

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

das würde auch funktionieren

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