Разделение целых чисел в массивах на отдельные цифры - PullRequest
1 голос
/ 27 апреля 2010

У меня есть массив:

int test[]={10212,10202,11000,11000,11010};

Я хочу разделить значения inetger на отдельные цифры и поместить их в новый массив как отдельные элементы, чтобы мой массив теперь был:

int test2[]={1,0,2,1,2,1,0,2,0,2,1,1,0,0,0,1,1,0,0,0,1,1,0,1,0};

Как бы я поступил так? Я делаю это в Java.

Спасибо.

Ответы [ 7 ]

10 голосов
/ 27 апреля 2010
int[] test={10212,10202,11000,11000,11010};
ArrayList<Integer> test2 = new ArrayList<Integer>();


for(int i = test.length -1; i >= 0; i--){
    int temp = test[i];
    while(temp>0){
        test2.add(0, temp%10);  //place low order digit in array
        temp = temp /10;        //remove low order digit from temp;
    }
}

Это будет делать именно то, что вы хотите, поместив цифру младшего разряда записи в «переднюю часть» массива и, следовательно, перед предыдущими цифрами / записями младшего разряда.

Если вам нужно, чтобы он был в массиве, у ArrayList есть метод toArray.

5 голосов
/ 27 апреля 2010

Вы можете перейти в соответствии с предложением Марка или преобразовать их в String, чтобы получить однозначные цифры:

int test[]={10212,10202,11000,11000,11010};
ArrayList<Integer> test2 = new ArrayList<Integer>();

for (int i : test)
{
  String str = String.valueOf(i);
  for (int j = 0; j < str.length(); ++j)
    test2.add((int)(str.charAt(j)-'0'));
}

В качестве более эффективного подхода к памяти, в котором по-прежнему используется строка, можно сохранить все цифры как одну строку и вычислить значение int на лету:

class Digits
{
  String str;

  Digits(int[] nums)
  {
    StringBuilder sb = new StringBuilder();
    for (int i : nums)
      sb.append(String.valueOf(i));

    str = sb.toString();
  }

  int length()
  {
    return str.length();
  }

  int nth(int i)
  {
    return (int)(str.charAt(i)-'0');
  }
}

Имейте в виду, что CheesePls - это решение right , потому что оно использует математику, как и предполагалось. Мой только для новичков (и просто чтобы дать другой подход к проблеме) ..

1 голос
/ 27 апреля 2010

Почти однострочный (если предположить, что есть встроенная функция для преобразования массива строк в массив целых):

int test[]={10212,10202,11000,11000,11010};
int result[] = strArray2IntArray (
                  Arrays.toString (test)
                 .replaceAll ("\\D", "")
                 .replaceAll ("(\\d)", "$1 ")
                 .split (" ")
               );

private static int[] strArray2IntArray (String[] array) {
    int[] result = new int[array.length];
    for (int i = 0; i < result.length; i++) {
        result[i] = Integer.parseInt (array[i]);
    }
    return result;
}
0 голосов
/ 27 апреля 2010

Вот способ сделать это со строками. Не особенно производительно, но (я надеюсь) легко понять.

package playground.tests;

import junit.framework.TestCase;

public class SplitIntegerTest extends TestCase {

    public void testIntsFromOneInteger() throws Exception {
        assertEqualArrays(new int[] { 1, 0, 2, 1, 2 }, intsFrom(10212));
    }

    public void testIntsFromArray() throws Exception {
        int test[] = { 10212, 10202, 11000, 11000, 11010 };

        int test2[] = { 1, 0, 2, 1, 2, 1, 0, 2, 0, 2, 1, 1, 0, 0, 0, 1, 1, 0,
                0, 0, 1, 1, 0, 1, 0 };

        assertEqualArrays(test2, intsFrom(test));
    }

    private int[] intsFrom(int[] input) {
        int[][] list = new int[input.length][];
        for (int i = 0; i < input.length; i++)
            list[i] = intsFrom(input[i]);
        int n = 0;
        for (int[] array : list)
            n += array.length;
        int[] result = new int[n];
        int index = 0;
        for (int[] array : list)
            for (int i : array)
                result[index++] = i;
        return result;
    }

    private static int[] intsFrom(Integer n) {
        String s = n.toString();
        int[] result = new int[s.length()];
        for (int i = 0; i < result.length; i++)
            result[i] = intFrom(s.charAt(i));
        return result;
    }

    private static int intFrom(Character c) {
        return Integer.parseInt(c.toString());
    }

    private static void assertEqualArrays(int[] a, int[] b) {
        assertEquals(a.length, b.length);
        for (int i = 0; i < b.length; i++)
            assertEquals(a[i], b[i]);
    }

}
0 голосов
/ 27 апреля 2010

Это (не проверено):

int test[] = {10212,10202,11000,11000,11010};
ArrayList<Integer> test2 = new ArrayList<Integer>();

for (int i : test)
{
  int p = test2.size();
  while (i > 0)
  {
     test2.add(p, i % 10);
     i /= 10;
  }
}
0 голосов
/ 27 апреля 2010

Попробуйте что-то вроде этого.

{
  int test[]={10212,10202,11000,11000,11010};
  int test2[] = new int[25];
  int i = 24;

  int temp;
  for(int n = test.size() - 1; n >= 0; n--){
    temp = test[n];
    while(temp > 0){
      test2[i--] = test % 10; // <= Gets remainder of division by 10.
      test /= 10; // <= Stores the integer result of the division.
    }
  }
}

Я не проверял этот код.

Этот код будет игнорировать начальные нули (естественно) и заполнять массив целых чисел. Получение правильного размера для массива может быть проблемой.

0 голосов
/ 27 апреля 2010

Вы берете каждое целое число, делите на 10 и отделяете дробь от остатка. умножьте дробь на 10, чтобы снова сделать ее целым числом, и поместите ее в новый массив. Повторяйте, пока у вас не кончатся цифры. Повторяйте, пока не исчерпаете целые числа во входном массиве.

...