2012-04-03 38 views
-2

我想用JAVA分解一個串入int數組,分解字符串轉換成int的陣列而不循環的java

我不想迭代訪問數組的每個元素

比類型轉換爲整數的溶液。

有沒有這方面的任何捷徑?

+7

我不確定我在追隨,你有'String []'而且你想讓它成爲'int []'嗎?或者是'String'到'int []'?或者你想要一個'Integer []'作爲結果?請更具體地說明你準備實現什麼* – amit 2012-04-03 13:08:45

+0

你有哪種字符串?你螞蟻分解哪種方式? – 2012-04-03 13:09:10

+2

爲什麼限制一個循環?循環做這件事最有可能是最直接的解決方案。 – Jim 2012-04-03 13:10:41

回答

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

編輯

如果你真的想沒有循環:

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

寫在我的問題我不需要任何循環。 解決方案如 String str =「123,456,789」; 列表 list = str.split(「,」); – 2012-04-03 13:12:00

+1

@yogeshprajapati你能告訴我們原因嗎? – talnicolas 2012-04-03 13:12:24

+0

@ talnicolas原因是因爲我有條目lacs,所以我不想循環每個。 – 2012-04-03 13:15:19

1

據我所知 - 沒有。沒有簡單的方法,因爲String只是一個char [],它只能通過ascii映射到整數。你可以得到一個字符串數組,假設你有一個分隔符,然後用一個將字符串轉換爲int的函數來引用String數組的每個索引,但是坦率地說,你正在使它對自己來說更難......

例如

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

但沒有辦法(我知道的),只是轉換的String []爲int []不只是躲在裏面其他一些方法中的循環...

+0

我希望列表中的所有元素。 – 2012-04-03 13:17:58

+0

@yogeshprajapati所以你不想要一個int數組,但一個List,請更正你的問題。 – talnicolas 2012-04-03 13:19:55

+0

這種無關緊要 - 如果沒有循環,仍然沒有辦法做到這一點。也許如果你解釋了爲什麼你不想要一個循環,那麼我們可以通過一些方法來避免你不想要循環的理由。 「 – 2012-04-03 13:22:27

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>這是更簡單 - 因爲你會從transform越來越Iterable<Integer>

@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作爲'分割器'循環的一部分? – 2012-04-03 13:23:38

0

望着評論約傑什已經加入到@馬特研究員答案:

'我想要列表中的所有元素。 - yogesh prajapati'

編寫由數組支持的List的自定義實現,並在訪問項時進行類型轉換。

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 2012-04-03 13:47:00

+0

+1同上!但至少我已經設法發佈另一個解決方案:) – Anonymous 2012-04-03 14:05:05

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

在那裏,沒有迭代。

但是,嚴重的人,任何解決方案將有某種形式的迭代(或遞歸)在某一點。