int to int[]

Hallo,

du musst dir die einzelnen Stellen der Zahl errechnen.


Code:
int zahl = 123456;
int number;

number = zahl % 10; //number = 6;
zahl /=10; //zahl = 12345

So hast du in number immer die einzelne Stelle, damit kannst du dann machen was du möchtest. Das ganze musst du dann wiederholen, bis du die Zahl durch hast.

Gruß

Sascha
 
Hallo,

eine Möglichkeit:
Java:
package de.tutorials;

import java.util.Arrays;

public class IntToIntA {

  /**
   * @param args
   */
  public static void main(String[] args) {
    int value = Integer.MAX_VALUE;
    
    //works only with positive numbers!
    
    int[] a = new int[value == 0 ? 1 : (int)Math.log10(value)+1];
    for(int i = 0; i < a.length ;i++){
      a[i] = value / (int)Math.pow(10, a.length-i-1) % 10;
    }       
    
    System.out.println(Arrays.toString(a));
    
  }

}

Gruß Tom
 
Java:
int zahl = 123456;
int number;

number = zahl % 10; //number = 6;
zahl /=10; //zahl = 12345

Das Problem dabei ist, dass er von hinten anfängt.

Hier fängt er von vorne an, allerdings ist dies eine String-Bearbeitung, d.h. du müsstest deine Daten bzw. Ergebnisse vermutlich parsen.
Java:
Pattern p = Pattern.compile("[0-9]");
Matcher m = p.matcher("123456");
while(m.find()) {
//System.out.println(m.group());
}

Edit: Alternativ wäre es natürlich auch mit charAt(i) möglich, allerdings wird hier jedes Zeichen ausgewertet, auch wenn es keine Zahl ist.
 
Zuletzt bearbeitet:
Java:
int zahl = 123456;
int number;

number = zahl % 10; //number = 6;
zahl /=10; //zahl = 12345

Das Problem dabei ist, dass er von hinten anfängt.

Hier fängt er von vorne an, allerdings ist dies eine String-Bearbeitung, d.h. du müsstest deine Daten bzw. Ergebnisse vermutlich parsen.
Java:
Pattern p = Pattern.compile("[0-9]");
Matcher m = p.matcher("123456");
while(m.find()) {
//System.out.println(m.group());
}

Edit: Alternativ wäre es natürlich auch mit charAt(i) möglich, allerdings wird hier jedes Zeichen ausgewertet, auch wenn es keine Zahl ist.

Es kommt ganz drauf an, von wo du anfängst dein Array zu befüllen. ;-)

Gruß

Sascha
 
Hier mal ein Ansatz, wie ich es intuitiv lösen würde:

Java:
public static void main(String[] args) {
		int zahl = 12345;
		String wort = new Integer(zahl).toString();
		int[] zahlen = new int[wort.length()];
		for (int i = 0; i < wort.length(); i++) {
			zahlen[i] = Integer.parseInt(wort.substring(i, i+1)); 
		}
		System.out.println(Arrays.toString(zahlen)); //Ausgabe: [1, 2, 3, 4, 5]
	}

Einfach den int in ein String umwandeln und dann jedes einzelne Zeichen des Strings hintereinander in ein int-Array packen.
 
Ich habe eure Vorschläge mal implementiert und die Zeiten gemessen. Wie zu erwarten, liegt die Lösung von Sascha vorne, jedoch ist die Variante mit CharAt extrem dicht dahinter, praktisch exakt so schnell. Die als letztes vorgeschlagene Methode mit Substring ist nicht empfehlenswert, da dort auch viele unnötige String-Objekte erzeugt werden. Die Lösung mit dem Regulären Ausdruck konnte ich nicht implementieren, da ich nicht weiß, wie ich vor dem durchlaufen an die Anzahl der Treffer kommen soll (um das Array zu initialisieren).

Java:
import java.util.Arrays;

class Speed {
    public static void main(String[] args) {
        long time;

        System.out.println(Arrays.toString(toIntArray_Mod(123456789)));
        System.out.println(Arrays.toString(toIntArray_String_CharAt(123456789)));
        System.out.println(Arrays.toString(toIntArray_String_Substring(123456789)));

        //System.out.println(Arrays.toString(toIntArray_CharArray(123456789)));

        time = System.currentTimeMillis();
        for(int i = 1; i<10000000; i++) {
            toIntArray_Mod(i);
        }
        System.out.printf("%dms%n",  System.currentTimeMillis() - time);

        time = System.currentTimeMillis();
        for(int i = 1; i<10000000; i++) {
            toIntArray_String_CharAt(i);
        }
        System.out.printf("%dms%n",  System.currentTimeMillis() - time);

        time = System.currentTimeMillis();
        for(int i = 1; i<10000000; i++) {
            toIntArray_String_Substring(i);
        }
        System.out.printf("%dms%n",  System.currentTimeMillis() - time);
    }

    private static int[] toIntArray_Mod(int i) {
        //find out how many digits the number has (would be easier with strings, but slower! check toIntArray_Mix for implementation)
        int j = i, numDigits = 0;
        while(j!=0) {
            j/=10;
            numDigits++;
        }

        int[]  arr = new int[numDigits];
        int k = arr.length - 1;
        while(i!=0) {
            arr[k] = i % 10;
            i/=10;
            k--;
        }

        return arr;
    }
    
    private static int[] toIntArray_String_CharAt(int i) {
        String number = String.valueOf(i);
        int length = number.length();
        int[] arr = new int[length];

        while(length > 0) {
            length--;
            arr[length] = number.charAt(length) - 48;            
        }

        return arr;
    }

    private static int[] toIntArray_String_Substring(int i) {
        String number = String.valueOf(i);
        int[] arr = new int[number.length()];

        for (int j = 0; j < number.length(); j++) {
            arr[j] = Integer.parseInt(number.substring(j, j+1));
        }

        return arr;
    }
}

Ausgabe:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
929ms
987ms
3118ms

Übrigens habe ich toIntArray_Mod keine schnellere Lösung gefunden, die Anzahl der Zeichen zu finden. Weder über String noch log(10) ging es schneller, als die Schleife zweimal zu durchlaufen.
 
Zuletzt bearbeitet:
Die Lösung mit dem Regulären Ausdruck konnte ich nicht implementieren, da ich nicht weiß, wie ich vor dem durchlaufen an die Anzahl der Treffer kommen soll (um das Array zu initialisieren).

Wie wäre es mit einer ArrayList :p dynamisch find ich es bei sowas immer besser ;)
 
Hallo,

wenns auf Geschwindigkeit ankommt hier ist noch eine Variante:
Java:
    private static int[] toIntArray(int value) {
        int numberOfDigits = 1;
        for (long v = 10; v <= value; v *= 10) {
            numberOfDigits++;
        }

        int[] array = new int[numberOfDigits];
        int k = numberOfDigits - 1;

        while (value != 0) {
            array[k] = value % 10;
            value /= 10;
            k--;
        }
        return array;
    }

Gruß Tom
 
Zurück