将字符串分解为int数组

时间:2011-08-25 14:19:44

标签: java arrays

如果字符串如下所示,将字符串数组分解为int数组的最短且最有效的方法是什么:

4 1 4 2 3
5 1 4 2 -1 6

我现在拥有它的方法是使用String split方法并将String数组迭代到int ..有没有比这更好的方法?

4 个答案:

答案 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;
}

}