2012-04-03 2 views
-2

Я хочу, чтобы разложить строку в Int массива с помощью JAVA,разлагать строку в массив междунар без петель Java

я не хочу решение, которое итерирует каждый элемент массива

чем напечатанный в целое ,

есть какие-либо недостатки для этого?

+7

Я не уверен, что следую, У вас есть 'String []', и вы хотите сделать его 'int []'? Или это 'String'' int [] '? Или вы хотите получить «Integer []»? Пожалуйста, будьте более конкретными, что * точно * вы пытаетесь достичь – amit

+0

Какая строка у вас есть? Каким образом вы муравьете разлагаетесь? –

+2

Почему ограничение на петлю? Выполнение этого путем цикла является наиболее вероятным решением. – Jim

ответ

1

Будешь должны перебирать на каждый символ вашей строки для достижения этой цели:

String str = "1234"; 
int[] array = new int[str.length()]; 

for (int i = 0; i < str.length(); i++) { 
    array[i] = Character.digit(str.charAt(i), 10); 
    // or 
    // array[i] = Integer.parseInt(str[i]); 
} 

EDIT

Если вы действительно не хотите, не цикл:

String str = "123,456,789"; 
String[] arr = str.split(","); 

ArrayList<Integer> list = new ArrayList<Integer>(); 

list.add(Integer.parseInt(arr[0])); 
list.add(Integer.parseInt(arr[1])); 
list.add(Integer.parseInt(arr[2])); 

Но придётся знайте число Integer, которое у вас есть, если вам не нужен цикл.

+0

как написано в моем Вопросе, мне не нужен какой-либо цикл. решение, подобное Строка str = "123,456,789"; Список list = str.split (","); –

+1

@yogeshprajapati Можете ли вы дать нам причину этого? – talnicolas

+0

@ talnicolas причина для этого у меня есть lacs записей, поэтому я не хочу, цикл для каждого. –

1

Насколько я знаю - нет. Нет простого способа сделать это, поскольку String - это просто char [], который только сопоставляется с целыми числами через ascii. Вы можете получить массив строк, предполагая, что у вас есть разделитель, затем ссылайтесь на каждый индекс массива String с помощью функции, которая преобразует String в int, но, откровенно говоря, вы делаете это намного сложнее для себя ...

например

String myEncodedInts = "7,14,12,9,3"; 
String[] myIntsAsStrings = myEncodedInts.split(","); 
//... 
int someReferenceAtSomeLaterPoint = Integer.parseInt(myIntsAsStrings[myReferenceIndex]); 

Но нет никакого способа (что я знаю) просто преобразуя String [] к междунар [], который не только скрыть петлю внутри какой-либо другой метод ...

+0

Я хочу весь элемент в списке . –

+0

@yogeshprajapati Таким образом, вам не нужен массив int, но List, пожалуйста, исправьте свой вопрос. – talnicolas

+0

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

2

Нет петель (видимо) ... но действительно ли это стоило?

import static org.hamcrest.MatcherAssert.assertThat; 
import org.hamcrest.collection.IsArrayContainingInOrder; 
import com.google.common.base.Function; 
import com.google.common.base.Splitter; 
import com.google.common.collect.Iterables; 

@Test 
public void testDecompose() { 
    final String input = "1,2,3,4"; 
    Integer arr [] = Iterables.toArray(Iterables.transform(Splitter.on(",").split(input), new Function<String,Integer>(){ 
     @Override public Integer apply(String input) { 
      return Integer.parseInt(input); 
     }}), Integer.class); 
    assertThat(arr, IsArrayContainingInOrder.arrayContaining(1,2,3,4)); 
} 

Чтобы получить Collection<Integer> или List<Integer> это еще проще - как вы будете получать Iterable<Integer> от transform:

@Test 
public void testDecompose() { 
    final String input = "1,2,3,4"; 
    List<Integer> l = Lists.newArrayList(Iterables.transform(Splitter.on(",").split(input), new Function<String,Integer>(){ 
     @Override public Integer apply(String input) { 
      return Integer.parseInt(input); 
     }})); 
    assertThat(l, IsCollectionContaining.hasItems(1,2,3,4)); 
} 
+3

«но это действительно стоило?» Нет;) Но +1 для усилий;) По-видимому, я предполагаю, что это по-прежнему зацикливается внутри, просто делая parseInt как часть цикла «Spliter»? –

0

Глядя на комментарий Yogesh добавил к Fellows @ Matt ответ:

'Я хочу весь элемент в списке. - yogesh prajapati '

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

2

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

private static void getNumbers(List<String> asList, List<Integer> myList) { 
    if (asList.isEmpty()) { 
     return; 
    } else { 
     String remove = asList.remove(0); 
     myList.add(Integer.parseInt(remove)); 
     getNumbers(asList, myList); 
    } 

} 

И код вызова:

String numbers = "1,2,3,4,5,6,7,8,9"; 
    List<String> inputList = new ArrayList<String>(); 
    inputList.addAll(Arrays.asList(numbers.split(","))); 
    List<Integer> outputList = new ArrayList<Integer>(); 

    getNumbers(inputList, outputList); 

    System.out.println(outputList); 
+0

Проклятия! Ударьте меня в середине пути, отвечая. +1 – Jim

+0

+1 То же, что и выше! Но по крайней мере мне удалось опубликовать другое решение :) – Anonymous

0
public toInts(String[] strings, int[] ints, int start) { 
    if (start > strings.length - 2) { 
     return; 
    } 
    ints[start] = Integer.parseInt(strings[start]); 
    toInts(string, ints, start+1); 
} 
... 
int[] ints = new int[3]; 
String[] strings = new String[]{"1", "2", "3"}; 
toInts(strings, ints, 0); 

Там нет итераций.

Но серьезно люди, любое решение будет иметь некоторую форму итерации (или рекурсии) в какой-то момент.

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