将字符串分解为长整型数组或长整型列表,而不使用循环在JAVA中
没有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在生产代码中使用 - 认为,这是明确的;)
我认为这不是时间复杂性,而是关于代码的简洁性。当我阅读它时,OP在函数式编程中需要类似'map'的东西(我认为Guava有类似的东西)。 – 2012-04-03 13:31:12
Java中不幸的是,循环是许多情况下最简洁/可读的形式。也许闭包会在Java 8中改变这种状况。 – 2012-04-03 13:41:31
下投票,因为在Java中,递归执行得更糟,然后执行纯循环。 JVM JIT编译器针对循环进行了优化,但目前没有针对JVM中的尾递归进行优化(与Lisp和其他几个VM不同)。 – 2012-04-04 17:18:59
没有就没有办法做到这一点没有环(即使你没有明确编写一个循环,你会叫会使用一种方法),除非你现在包含在String
long
值的数量和将它们手动添加到您的List
。
当然有:尾递归。当涉及到处理器层面时,*所有控制结构都转到*。另外,如果辅助函数使用循环,我不认为这会对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);
}
});
你最好的选择是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);
}
});
注:当然番石榴必须做一个循环来实现这一点,但在你的代码中没有循环。
缺少一个'public',否则它与Eugene的答案令人惊讶地相似... – 2012-04-03 13:33:39
LOL :-)否我没有复制它 – Zapodot 2012-04-03 13:36:42
Simplified Eugene回答Guava图书馆。自番石榴16.0。
List<Long> longList = Lists.transform(Arrays.asList(stringArray), Longs.stringConverter());
那么这个数组包含'long's的字符串表示?你需要更具体,包括所需的输入/输出和你自己解决它的尝试。 – 2012-04-03 13:24:48
最近问了一个[this]的重复(http://stackoverflow.com/questions/9993916/decompose-a-string-into-array-of-int-without-loop-java)。 – darrengorman 2012-04-03 13:27:44
@milkplusvellocet:不,另一个问题是关于将字符串解析为一个整数的数组。这个问题是关于将字符串数组“转换”为长数组(不定义“转换”部分) – 2012-04-03 13:29:45