2010-04-27 3 views
1

У меня есть массив:Деление целых чисел в массивах на отдельные цифры

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.

спасибо.

+0

ли все числа в Диапазон 10000 - 19999? Или: как насчет ведущих нулей? – rsp

ответ

10
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, и поэтому перед предыдущей низкой порядка цифрах/записи.

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

+1

Это более эффективно с точки зрения памяти, чем решение Джека, поскольку промежуточная строка не требуется, но некоторые разработчики могут усложнить ее понимание. В большинстве случаев я бы пошел с Джеком, но я голосую за него. –

+1

Я не понимаю, что так сложно с помощью массива обратного или базового целочисленного манипулирования. Это так же просто, как обратный отсчет или математика 5-го класса. -but да, чтение for-statement может быть сложным, если вы к нему не привыкли. – CheesePls

+0

@ neilwhitaker1: если разработчик имеет проблему, понимающую эту основную часть кода, то они, очевидно, не ориентированы на математику ** вообще ** (потому что это действительно базовое), и, возможно, они должны, ну, начать либо обучение, либо поиск другой работы ;) – SyntaxT3rr0r

0

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

+0

Используя mod 10, вы можете предотвратить арифметику с плавающей запятой. – rsp

+0

Кроме того, вы закончите с цифрами каждого номера, которые были бы отменены с помощью этого метода, или @ Timmmm ... было бы проще использовать метод на основе String, который, как мне кажется, (как указал Йоахим, нет никаких указаний на то, что производительность является проблемой здесь). –

0

Попробуйте что-нибудь подобное.

{ 
    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. 
    } 
    } 
} 

Я еще не протестировал этот код.

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

5

Вы можете пойти, как предложил Марк, или преобразовать их в 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 решение является право на e, потому что он использует математику, поскольку она предназначена для использования. Шахта только для нубов (и просто дать другой подход к проблеме) ..

+1

Преобразование его назад и вперед из строки было бы очень неэффективным. – zmbush

+2

@zipcodeman: как бы хранить каждую цифру в своем собственном 'int'. Так в чем ваш смысл? –

+1

Строка не требует участия. – zmbush

0

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

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

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

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]); 
    } 

} 
1

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

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; 
} 
Смежные вопросы