如果字符串如下所示,将字符串数组分解为int数组的最短且最有效的方法是什么:
4 1 4 2 3
5 1 4 2 -1 6
我现在拥有它的方法是使用String split方法并将String数组迭代到int ..有没有比这更好的方法?
答案 0 :(得分:2)
没关系 - 我只需致电split(" ")
,然后在结果元素上使用Integer.parseInt()
。
如果您可能在整数之间有多个空格,则需要split("\\s+")
之类的空格才能正常工作。
如果这就是你正在做的事情,我认为没有更好的办法!
编辑:也许我应该将术语更好地 - 我的意思是,出于所有实际目的,除非你真的遇到性能关键问题,否则我会坚持使用这种方法,因为它干净简单了解发生了什么!答案 1 :(得分:2)
使用split()
消耗更多空间[和时间],因为创建了新的String
对象,但它比任何其他方式更优雅[和简单]。
除非表现非常关键,否则我会坚持这样做。
答案 2 :(得分:1)
算法比分割方法快3倍! :)
为了它的乐趣,我制作了一种比分割方法快得多的算法。 也许没有你应该使用的,因为我会说分裂更清洁,更清洁比速度更重要。唐纳德克努特对过早优化的引用也是所有邪恶的根本原因。
输出
1189ms // My algorithm first loop
3305ms // Split algorithm runtime first loop
1173ms // My algorithm second loop
3305ms // Split algorithm second loop
代码
import java.util.ArrayList;
class FarmorsOptimized {
@SuppressWarnings({ "rawtypes", "unchecked" })
private static ArrayList getFarmors(String s) {
ArrayList intArr = new ArrayList();
int stopvalue = s.length() ;
for (int i = 0; i < stopvalue;) {
int negativ = 0;
if (s.charAt(i) == '-') {
negativ = 1;
}
intArr.add(Integer.parseInt(s.substring(i, i+1+negativ)));
i+=2+negativ;
}
return intArr;
}
@SuppressWarnings({ "rawtypes", "unchecked" })
private static ArrayList getSplits(String s) {
ArrayList intArr = new ArrayList();
for(String str : s.split(" ")){
intArr.add(Integer.parseInt(str));
}
return intArr;
}
public static void main(String[] args) {
String s = "1 2 4 -6 7 1 2 4 -6 7 1 2 4 -6 7 1 2 4 -6 7 1 2 4 -6 7 1 2 4 -6 7 1 2 4 -6 7";
int times = 1000000;
//Just to init everything
for (int i = 0; i < times; i++) {
getFarmors(s);
getSplits(s);
}
long starttime = System.currentTimeMillis();
for (int i = 0; i < times; i++) {
getFarmors(s);
}
System.out.println(System.currentTimeMillis() - starttime);
starttime = System.currentTimeMillis();
for (int i = 0; i < times; i++) {
getSplits(s);
}
System.out.println(System.currentTimeMillis() - starttime);
starttime = System.currentTimeMillis();
for (int i = 0; i < times; i++) {
getFarmors(s);
}
System.out.println(System.currentTimeMillis() - starttime);
starttime = System.currentTimeMillis();
for (int i = 0; i < times; i++) {
getSplits(s);
}
System.out.println(System.currentTimeMillis() - starttime);
}
答案 3 :(得分:1)
回答评论讨论。 这个答案适用于所有的整数。 它明显快于拆分。
1295ms my
2193ms split
1155ms my
1889ms split
码
import java.util.ArrayList;
class FarmorsOptimized {
public static void main(String[] args) {
String s = "32324 -324 873249 -8544876 -74093 -3243274 4325 643286 92325 -21376218 -213 2132531 2314 1 2";
int times = 1000000;
long starttime = System.currentTimeMillis();
for (int i = 0; i < times; i++) {
getFarmors(s);
}
System.out.println(System.currentTimeMillis() - starttime);
starttime = System.currentTimeMillis();
for (int i = 0; i < times; i++) {
getSplits(s);
}
System.out.println(System.currentTimeMillis() - starttime);
starttime = System.currentTimeMillis();
for (int i = 0; i < times; i++) {
getFarmors(s);
}
System.out.println(System.currentTimeMillis() - starttime);
starttime = System.currentTimeMillis();
for (int i = 0; i < times; i++) {
getSplits(s);
}
System.out.println(System.currentTimeMillis() - starttime);
}
@SuppressWarnings({ "rawtypes", "unchecked" })
private static ArrayList getFarmors(String s) {
ArrayList intArr = new ArrayList();
int stopvalue = s.length();
for (int i = 0; i < stopvalue;) {
int j = 0;
while (true) {
if ((i + j) == stopvalue || s.charAt(i + j) == ' ') {
break;
}
j++;
}
intArr.add(Integer.parseInt(s.substring(i, i + j)));
i += j + 1;
}
return intArr;
}
@SuppressWarnings({ "rawtypes", "unchecked" })
private static ArrayList getSplits(String s) {
ArrayList intArr = new ArrayList();
String[] strArr = s.split(" ");
for(int i = 0; i < strArr.length ; i++){
intArr.add(Integer.parseInt(strArr[i]));
}
return intArr;
}
}