2016-09-14 2 views
1

Я пытаюсь взять строку, т. Е. $!#, преобразовать каждый отдельный символ в соответствующее значение ASCII, здесь он равен 36, 33, 35, а затем заканчивается массивом целых чисел с каждым отдельным номером, хранящимся в отдельном индексе, что означает 3, 6, 3, 3, 3, 5.(Java) Преобразование строки символов в целочисленный целочисленный массив

Короче: От $!# до $,!,# в 36, 33, 35 к 3, 6, 3, 3, 3, 5

Поскольку я использую Processing (обертка для Java), мой SO-исследования у меня до сих пор:

String str = "$!#"; 
byte[] b = str.getBytes(); 

for (int i=0; i<b.length; i++){ 
println(b[i]); 
} 

Я окончание с значениями ASCII. Байт-массив b содержит [36, 33, 35].

Теперь, если бы это были строки вместо байтов, я бы использовал String.valueOf (b), чтобы получить 363335, а затем снова разделить все это на целочисленный целочисленный массив.

Интересно, неужели этот подход излишне усложнен и может быть выполнен с меньшими шагами преобразования. Какие-либо предложения?

+0

Вы можете обработать каждый символ, например. '$' -> '36' ->' 3,6' – Taylor

+1

Вы уверены, что входной символ не имеет значения ASCII> 99? – rkosegi

+1

Что именно вы имеете в виду, когда говорите это ** кажется неэффективным **? Как вы определяете эффективность? Почему вы считаете, что ваша работа плоха? Насколько велики ваши значения «String»? В каком контексте работает этот код? –

ответ

1

Честно говоря, если бы я был вами, я бы не стал слишком беспокоиться о «эффективности», пока у вас не возникнет проблема. Напишите код, который вы понимаете. Если у вас есть проблемы с эффективностью, вам нужно будет точно определить, что вы имеете в виду: происходит ли слишком много шагов? Это слишком долго? Каков размер вашего ввода?

Обратите внимание, что описанный вами подход и подход ниже - это O (N), который, вероятно, лучше всего вы получите.

Если у вас есть определенное узкое место внутри этого O (N), тогда вы должны выполнить профилирование, чтобы выяснить, где это. Но вы не должны беспокоиться о микро-оптимизации (или shudder преждевременных оптимизаций) просто потому, что вы «чувствуете» что-то «неэффективно».

Цитирую this answer:

... в отсутствие измеряемых проблем производительности вы не должны оптимизировать, потому что вы думаете вы получите выигрыш в производительности.

Если бы я тебя, я бы просто использовать функцию charAt(), чтобы каждый char в String, а затем использовать функцию int(), чтобы преобразовать это char в int. Тогда вы могли бы добавить эти int значения в String (или еще лучше, а StringBuilder):

String str = "$!#"; 

StringBuilder digits = new StringBuilder(); 
for (int i=0; i<str.length(); i++) { 
    int c = int(str.charAt(i)); 
    digits.append(c); 
} 

Затем вы можете использовать функцию split() разделить их на отдельные цифры:

String[] digitArray = digits.toString().split(""); 
for (String d : digitArray) { 
    println(d); 
} 

гравюр:

3 
6 
3 
3 
3 
5 

Существует множество способов сделать это: вы можете использовать toCharArray() вместо charAt(), например.Но ничто из этого не будет более или менее «эффективным», пока вы точно не определите, что вы подразумеваете под эффективностью.

+0

Он хочет, чтобы это был массив 'int []', такой как '3,6,3,3,3,5', а не' 36,33,35'. – Orin

+0

Я не думаю, что это то, что ОП задает ... – brso05

+0

@ Orin2005 См. Мой отредактированный ответ. –

0

Java 8 Решение потока:

int[] digits = "$!#".chars() 
        .mapToObj(Integer::toString) 
        .flatMapToInt(CharSequence::chars) 
        .map(c -> c - '0') 
        .toArray(); 
System.out.println(Arrays.toString(digits)); // prints [3, 6, 3, 3, 3, 5] 
+1

Обратите внимание, что это вопрос [тег: обработка], а обработка не поддерживает Java 8. Кроме того, является ли это «более эффективным», чем решение OP, или просто скрывает O (N) внутри API потока? Я не говорю, что ваш вопрос неверен (на самом деле мне всегда нравятся решения Java 8), но вы можете включить эту информацию в свой ответ. –

0

Одним из решений может делать что-то вроде этого

// Create an array of int of a size 3 * str.length() 

for(int i = 0; i < str.length(); i++) 
{ 
    int n = (int) str.charAt(i); 
    int a = n/100; 
    int b = (n - (a * 100))/10; 
    int c = n - (a * 100) - (b * 10); 

    // push a, b and c in your array (chose the order and if you want 
    // to add the potential 0's or not) 
} 

Но, как другие говорили раньше, я не уверен, что стоит играть так. Я думаю, это зависит от вашего приложения.

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