2016-10-07 2 views
2

Возможно ли до cast a int array до char array? Если да - how?Преобразование массива int в массив char


В настоящее время я работаю над проектом, где я должен create an char array, содержащий alphabet. Мой ток code Creats в int array (который должен быть converted к char array - в одной линии!):

return IntStream.range('a', 'z' + 1).toArray();

+0

Если вы хотите конвертировать цифры (0-9), вам может добавить к нему 48 и бросить, или что-то вроде 'Character.forDigit (a, 10)' ;. –

+0

Да, это возможно, просто преобразуйте свой номер в 16 оснований, состоящий из a-f и 0-9 :)) –

+2

Нет, вы не можете использовать 'int []' to 'char []'. Кроме того, * ваш * текущий код не работает, поэтому не имеет значения, насколько он короток. Первое правило оптимизации: оно должно работать. Так как Java 8 не имеет «CharStream», вы должны сделать это с помощью обычного цикла 'for'. Он занимает всего 3 строки кода (4 с оператором return), и он работает! * – Andreas

ответ

3

Да, нам не хватает метода потока для создания массива символов. Может быть, целый класс CharStream. В любом случае нет, вы не можете использовать между int[] и char[].

В то же время, он получает длинную линию, но это работает:

return IntStream.rangeClosed('a', 'z') 
      .mapToObj(c -> Character.toString((char) c)) 
      .collect(Collectors.joining()) 
      .toCharArray(); 

Это дает char[] содержащий

[a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z] 
+0

Работает как шарм ! +1, потому что вы arren't «Это не работает» - человек: P – TheRealVira

+1

'IntStream.range ('a', 'z' + 1)' можно заменить на 'IntStream.rangeClosed ('a', 'z') ' – Pshemo

+0

@Pshemo, thx, он может принадлежать как комментарий к вопросу (откуда я взял' IntStream.range ('a', 'z' + 1) '), но в любом случае он становится более читаемым. –

0

Давайте держать это одна линия, то:

return IntStream.range('a', 'z' + 1).mapToObj(i -> Character.valueOf((char) i)).toArray(Character[]::new); 

Преобразует от IntStream, до Stream<Character>. Имейте в виду, что символы и ints по существу одинаковы с точки зрения многих вычислений, поэтому этот шаг может быть ненужным (особенно для сравнения).

Edit:

Fixed выше линии, чтобы быть функциональным, есть лучшее решение, но я все еще пытаюсь найти его снова. В настоящее время он возвращает массив Character[].

Без ограничения по 1 строке просто просто переделать массив, обработав a как ваш индекс 0.

char[] back = new char[('z' + 1) - 'a']; 
IntStream.range('a', 'z' + 1).forEach(i -> back[i - 'a'] = (char) i); 
return back; 
+0

Вот что я говорю! Единственная проблема заключается в том, что он возвращает массив объектов - как я могу передать его в массив символов? : 3 – TheRealVira

+0

Я не уверен, что его только мой компилятор, но ваше решение приводит к следующей ошибке для меня: Ошибка: java: несовместимые типы: java.lang.Integer не может быть преобразован в char – hasan

+0

Нет, вы оба правы, лучше всего я отредактирую его за мгновение. – Rogue

0

Вы не можете использовать массив int для массива char, поскольку существуют абсолютно разные типы.

Есть 2 возможных варианта:

1) создать массив символов и скопировать каждое значение из массива Int 2) использовать общие списки или коллекций. Вы можете просто использовать его для литья

+0

Да, мы можем! http://stackoverflow.com/a/39912839/6901146 – TheRealVira

+0

@TheRealVira потоков это делает. а не массивы –

+0

Просто для правильного использования, @AlexKlimashevsky прав, мой ответ не делает * cast *, но решает вашу проблему другими способами. –

Смежные вопросы