2014-01-28 12 views
2

Я новичок на этом сайте и, если я здесь, это потому, что я не нашел ответа нигде в Интернете и поверю мне: я давно искал поисковые запросы но все, что я мог найти, это то, как преобразовать число в массив, а не наоборот. Я ищу простой способ или функцию для преобразования массива int в число int. Позвольте мне объяснить, например, у меня есть это: int array to int number in Java

int[] ar = {1, 2, 3}; 

И я хочу, чтобы это:

int nbr = 123; 

В моей голове это будет выглядеть следующим образом (даже если я знаю, что это не правильный путь):

int nbr = ar.toInt(); // I know it's funny 

Если у вас есть какие-либо идеи о том, как я мог бы сделать это, это было бы удивительным.

+0

Перебирайте массив, преобразуйте каждый элемент в строку и поместите его в StringBuffer или просто соедините с строкой. –

+2

ОК, ребята, хватит со строками ответов. Их 4. Этого достаточно. – Radiodef

+0

Струны .... люди сумасшедшие или вообще не имеют никакого отношения к компьютерному программированию. Я передал ** ВСЕ ** ответы, связанные со строками. – Manu343726

ответ

1

Вам необходимо выполнить цикл в массиве и добавить нужное значение. Правильное значение - это текущий элемент массива, умноженный на позицию 10 ^.

Итак: ар [0] * 1 + ар [1] * 10 + ар [2] * 100 + .....

int res=0; 
    for(int i=0;i<ar.length;i++) { 
     res=res*10+ar[i]; 
    } 

Или

for(int i=0,exp=ar.length-1;i<ar.length;i++,exp--) 
     res+=ar[i]*Math.pow(10, exp); 
+3

Это приведет к 321, вы знаете. –

+0

Вы правы: D Я отредактирую его – Alessio

9

начать с результат 0. Пропустите все элементы вашего массива int. Умножьте результат на 10, затем добавьте текущее число из массива. В конце цикла у вас есть результат.

  • Результат: 0
  • Цикл 1: Результат * 10 => 0, результат + 1 => 1
  • Цикл 2: Результат * 10 => 10, Результат + 2 => 12
  • Цикл 3: Результат * 10> = 120, Result + 3 => 123

Это может быть обобщена для любого основания, изменив базу 10 (здесь) к чему-то еще, например 16 для шестнадцатеричной.

+2

Рад, что кто-то предложил умножить каждого на десять, вместо использования StringBuilder и разбора его. – mjgpy3

+0

На самом деле, я не могу получить ни один из приведенных ниже алгоритмов. Так вы могли бы прояснить, что выше, и сказать мне, как я могу это сделать в java? – gotgot1995

+0

@ gotgot1995 Даже если вы правильно используете этот метод, то ваш ввод с использованием типа int будет работать неправильно. Ваш вход должен быть большим, чтобы удерживаться в 'int'. Вам нужно использовать тип 'long' –

0

Используйте этот метод, используя длинный ввод, чтобы ваш вход был большим для int.

long r = 0; 
for(int i = 0; i < arr.length; i++) 
{ 
    int offset = 10; 
    if(arr[i] >= 10) 
     offset = 100; 
    r = r*offset; 
    r += arr[i]; 
} 

Это проверяет, если текущий int больше 10, чтобы сбросить смещение до 100, чтобы получить дополнительные места. Если вы включаете значения> 100, вам также потребуется добавить дополнительное смещение.


Подставляя это в конце моего поста из-за все downvotes строк ... что совершенно законный ответ ...OP никогда не просил наиболее эффективный способ сделать это просто wannted ответ

Loop ваш массив, добавляя в строку каждый ИНТ в массиве, а затем разобрать строку обратно в ИНТ

String s = ""; 
for(int i = 0; i < arr.length; i++) 
     s += "" + arr[i]; 
int result = Integer.parseInt(s); 

От Вашего комментарий номер, который вы слишком долго для int, вам нужно использовать long

String s = ""; 
for(int i = 0; i < arr.length; i++) 
     s += "" + arr[i]; 
long result = Long.parseLong(s); 
+0

Извините, но я получаю сообщение об ошибке при запуске: java.lang.NumberFormatException: для строки ввода: «2151410152118» – gotgot1995

+0

Это потому, что это приводит к тому, что Number слишком велико для хранения 'int', вам нужно будет использовать длинный. Причина, по которой вы не получите этого исключения при использовании других методов добавления, заключается в том, что вы получите ошибку опрокидывания –

+0

1. Не делайте этого. 2. Если вы это сделаете, не используйте '+ =', используйте 'StringBuilder' – Darkhogg

3

Сначала вам придется конвертировать все числа в строку, а затем сцепить строки и разобрать его обратно в целое число. Вот одна реализации:

int arrayToInt(int[] arr) 
{ 
    //using a Stringbuilder is much more efficient than just using += on a String. 
    //if this confuses you, just use a String and write += instead of append. 
    StringBuilder s = new StringBuilder(); 

    for (int i : arr) 
    { 
     s.append(i); //add all the ints to a string 
    } 

    return Integer.parseInt(s.toString()); //parse integer out of the string 
} 

Обратите внимание, что это приводит к ошибке, если какие-либо из значений прошлых первой в массиве, как отрицательные, так как минус знаки будут мешать разбор.

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

int arrayToInt(int[] arr) 
{ 
    int result = 0; 

    //iterate backwards through the array so we start with least significant digits 
    for (int n = arr.length - 1, i = 1; n >= 0; n --, i *= 10) 
    { 
     result += Math.abs(arr[n]) * i; 
    } 

    if (arr[0] < 0) //if there's a negative sign in the beginning, flip the sign 
    { 
     result = - result; 
    } 

    return result; 
} 

Эта версия не будет выдавать ошибку, если какой-либо из значений прошлых первый отрицательны, но он будет производить странные результаты.

Для этого нет встроенной функции, поскольку значения массива обычно представляют собой разные числа, а не цифры в числе.

EDIT:

В ответ на ваши комментарии, попробуйте эту версию, чтобы иметь дело с долгот:

long arrayToLong(int[] arr) 
{ 
    StringBuilder s = new StringBuilder(); 

    for (int i : arr) 
    { 
     s.append(i); 
    } 

    return Long.parseLong(s.toString()); 
} 

Edit 2:

В ответ на ваш второй комментарий:

int[] longToIntArray(long l) 
{ 
    String s = String.valueOf(l); //expand number into a string 

    String token; 

    int[] result = new int[s.length()/2]; 

    for (int n = 0; n < s.length()/2; n ++) //loop through and split the string 
    { 
     token = s.substring(n*2, (n+2)*2); 
     result[n] = Integer.parseInt(token); //fill the array with the numbers we parse from the sections 
    } 

    return result; 
} 
+0

* Обратите внимание, что это не удастся, если какое-либо из значений в вашем массиве будет отрицательным *, поскольку оно если бы кто-нибудь ответил ... вероятно, был бы случай недопустимого ввода, если он произошел –

+0

@JavaDevil True ... неясно, что должно было произойти в этом случае. – ApproachingDarknessFish

+0

Здесь то же самое! Я получаю эту ошибку: java.lang.NumberFormatException: для строки ввода: «2151410152118» – gotgot1995

2

Да, вы можете написать эту функцию самостоятельно

int toInt(int[] array) { 
    int result = 0; 
    int offset = 1; 
    for(int i = array.length - 1; i >= 0; i--) { 
     result += array[i]*offset; 
     offset *= 10; 
    } 
    return result; 
} 

Я думаю, что логика, лежащая в ее основе, довольно проста. Вы просто запускаете массив (последний элемент сначала) и умножаете число с правильной мощностью 10 ", чтобы поместить номер в нужное место". В конце вы получите возвращаемый номер.

2
int nbr = 0; 
for(int i = 0; i < ar.length;i++) 
    nbr = nbr*10+ar[i]; 

В конце концов, вы получаете нужный nbr.

Для нового массива, который вы нам дали, попробуйте этот. Я не вижу возможности использовать какую-либо форму String, и вам придется использовать длинный, а не int.

int [] ar = {2, 15, 14, 10, 15, 21, 18}; 
long nbr = 0; 
double multiplier = 1; 
for(int i = ar.length-1; i >=0 ;i--) { 
    nbr += ar[i] * multiplier; 
    multiplier = Math.pow(10, String.valueOf(nbr).length()); 
} 

Если вы действительно хотели, чтобы избежать String (не знаю почему), я думаю, вы могли бы использовать

multiplier = Math.pow(10,(int)(Math.log10(nbr)+1)); 

, который работает до тех пор, как последний элемент в массиве не 0.

+1

Если мой массив инициализирован следующим образом: int [] arr = {2, 15, 14, 10, 15, 21, 18}; ваш алгоритм дает мне это: но я хотел бы это 2151410152118. – gotgot1995

0

Если вы можете использовать Java 1.8, stream API делает это очень простым:

@Test 
public void arrayToNumber() { 
    int[] array = new int[]{1,2,3,4,5,6}; 
    StringBuilder sb = new StringBuilder(); 

    Arrays.stream(array).forEach(element -> sb.append(element)); 

    assertThat(sb.toString()).isEqualTo("123456"); 
}