Break an integer into small parts in Java

0

I need to put each digit of an integer in a position of a vector.

int a = 123;
List<Integer> numerosGerados = new ArrayList<>();

And now I need to put the number 1 in position 0 of the array , the number 2 in the 1, and so on. The number may be negative.

    
asked by anonymous 05.03.2015 / 22:12

4 answers

7

Response based on mgibsonbr, but without inverting the list:

int a = 123;
List<Integer> numerosGerados = new ArrayList<>();

int x = a > 0 ? a : -a;
do {
    numerosGerados.add(0, x % 10);
    x /= 10;
} while (x > 0);

if (a < 0) numerosGerados.set(0, -numerosGerados.get(0));

If the given number is negative, the first element of the list will also be negative.

    
05.03.2015 / 22:40
5

Mathematically solving:

import java.util.*;

class Ideone {
    public static void main (String[] args) {
        ImprimeLista(SeparaDigitos(12345));
        ImprimeLista(SeparaDigitos(-123));
        ImprimeLista(SeparaDigitosNegativo(-123));
        ImprimeLista(SeparaDigitosNegativo(123));
    }
    public static List<Integer> SeparaDigitos(int valor) {
        List<Integer> numerosGerados = new ArrayList<>();
        int positivo = Math.abs(valor);
        int tamanho = (int)(Math.log10(positivo) + 1);
        int posicao = 0;
        while(posicao < tamanho) {
            int digito = valor / (int)Math.pow(10, tamanho - posicao - 1) * Integer.signum(valor);
            numerosGerados.add(digito);
            valor %= digito * Math.pow(10, tamanho - posicao - 1);
            posicao++;
        }
        return numerosGerados;
    }
    public static List<Integer> SeparaDigitosNegativo(int valor) {
        List<Integer> numerosGerados = new ArrayList<>();
        int positivo = Math.abs(valor);
        int tamanho = (int)(Math.log10(positivo) + 1);
        int posicao = 0;
        while(posicao < tamanho) {
            int digito = valor / (int)Math.pow(10, tamanho - posicao - 1) * (posicao == 0 ? 1 : Integer.signum(valor));
            numerosGerados.add(digito);
            valor %= digito * Math.pow(10, tamanho - posicao - 1);
            posicao++;
        }
        return numerosGerados;
    }
    public static void ImprimeLista(List<Integer> lista) {
        for (int item : lista) {
            System.out.println(item);
        }
        System.out.println();
    }
}

See running on ideone .

I've put two ways of treating negative, one that ignores the signal and another that considers the signal in the first digit.

    
05.03.2015 / 22:30
3

This is a case where it is easier to get the digits in reverse order, and then reverse the list. For to get the last digit of a positive integer, just do the rest of the division by 10:

int a = -123;
List<Integer> numerosGerados = new ArrayList<>();

boolean negativo = (a < 0);
int x = negativo ? -a : a;
do {
    numerosGerados.add(x % 10);
    x /= 10;
} while (x > 0);
Collections.reverse(numerosGerados); // Inverte a lista

if ( negativo ) {
    // ??? (não dá pra colocar um "-" numa lista de inteiros...)

    // Exemplo: faz com que o primeiro deles seja negativo
    int primeiro = numerosGerados.get(0);
    numerosGerados.set(0, -primeiro);
}

Result: [-1,2,3]

    
05.03.2015 / 22:31
2
int value = 12345;
ArrayList<Integer> array = new ArrayList<>();

for(char each : Integer.toString(value).toCharArray())
   array.add(Integer.parseInt(Character.toString(each)));

Example running on Ideone

    
05.03.2015 / 22:25