2012-04-03 41 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); 

在那里,没有迭代。

但是,严重的人,任何解决方案将有某种形式的迭代(或递归)在某一点。