将字符串分解为长整型数组或长整型列表,而不使用循环在JAVA中

问题描述:

我想将字符串数组分解为长整数或列表。 我不想使用循环。将字符串分解为长整型数组或长整型列表,而不使用循环在JAVA中

是否有任何Java方法来做到这一点。

+0

那么这个数组包含'long's的字符串表示?你需要更具体,包括所需的输入/输出和你自己解决它的尝试。 – 2012-04-03 13:24:48

+0

最近问了一个[this]的重复(http://*.com/questions/9993916/decompose-a-string-into-array-of-int-without-loop-java)。 – darrengorman 2012-04-03 13:27:44

+1

@milkplusvellocet:不,另一个问题是关于将字符串解析为一个整数的数组。这个问题是关于将字符串数组“转换”为长数组(不定义“转换”部分) – 2012-04-03 13:29:45

没有O(1)操作将“String[]”(使用数字字符串)“转换”为long[]。如果循环可见或隐藏在某些第三方方法中,它将始终为O(n)。

如果你不想“看”的循环,只是实现的方法

Long[] pseudoOneStepConversion(numbers); 

和实施

privat Long[] pseudoOneStepConversion(String[] numbers) { 
    Long[] result = new long[numbers.length]; 
    for (int i = 0; i < numbers.length; i++) 
    result[i] = Long.parseLong(numbers[i]); 
    return result; 
} 

我们可以做到这一点递归太 - 它仍然是O(n),性能较差并且看起来不像循环:

public static void main(String[] args) { 
    List<Long> target = new ArrayList<Long>(); 
    copy(new String[]{"1", "2", "3"}, target, 0); 
    System.out.println(target); 
} 

private static void copy(String[] source, List<Long> target, int index) { 
    if (index == source.length) 
     return; 
    target.add(Long.parseLong(source[index])); 
    copy(source, target, index+1); 
} 

注 - 因为我开始越来越downvotes的递归例子:这是纯粹的学术,而不是inteded在生产代码中使用 - 认为,这是明确的;)

+0

我认为这不是时间复杂性,而是关于代码的简洁性。当我阅读它时,OP在函数式编程中需要类似'map'的东西(我认为Guava有类似的东西)。 – 2012-04-03 13:31:12

+0

Java中不幸的是,循环是许多情况下最简洁/可读的形式。也许闭包会在Java 8中改变这种状况。 – 2012-04-03 13:41:31

+0

下投票,因为在Java中,递归执行得更糟,然后执行纯循环。 JVM JIT编译器针对循环进行了优化,但目前没有针对JVM中的尾递归进行优化(与Lisp和其他几个VM不同)。 – 2012-04-04 17:18:59

没有就没有办法做到这一点没有环(即使你没有明确编写一个循环,你会叫会使用一种方法),除非你现在包含在Stringlong值的数量和将它们手动添加到您的List

+1

当然有:尾递归。当涉及到处理器层面时,*所有控制结构都转到*。另外,如果辅助函数使用循环,我不认为这会对OP造成问题,只要他不必通过重复迭代来监控他/她的代码即可。 – 2012-04-03 13:31:32

随着3rd party libraries一点点帮助,您可以避开编码在你自己的代码中循环,但是会有一个循环在某个地方。例如:

List<String> stringList = Arrays.asList(stringArray); 
List<Long> longList = Lists.transform(stringList, new Function<String, Long>() { 
    public Long apply(String s) { 
     return Long.valueOf(s); 
    } 
}); 

ListsFunction是番石榴库。

你最好的选择是Guavas Lists.transform功能。

String[] stringArray = {"1999", "20000"}; 
List<String> stringList = Arrays.asList(stringArray); 
List<Long> longList = Lists.transform(stringList, 
             new Function<String, Long>() { 
               Long apply(String value) { 
               return Long.valueOf(value); 
             } 
         }); 

注:当然番石榴必须做一个循环来实现这一点,但在你的代码中没有循环。

+0

缺少一个'public',否则它与Eugene的答案令人惊讶地相似... – 2012-04-03 13:33:39

+0

LOL :-)否我没有复制它 – Zapodot 2012-04-03 13:36:42

Simplified Eugene回答Guava图书馆。自番石榴16.0。

List<Long> longList = Lists.transform(Arrays.asList(stringArray), Longs.stringConverter());