2011-10-04 50 views
45

我有一個字符串字符串轉換成int數組中的Java

String arr= "[1,2]"; 

即「[1,2]」就像是一個字符串

如何轉換這種改編在java中

爲int數組
+4

發佈有效的Java實例。 –

+0

這是一個家庭作業問題嗎? –

+1

您的示例代碼不能編譯。請修復它。也就是說,看看StringTokenizers:http://download.oracle.com/javase/6/docs/api/java/util/StringTokenizer.html –

回答

76
String arr = "[1,2]"; 
String[] items = arr.replaceAll("\\[", "").replaceAll("\\]", "").replaceAll("\\s", "").split(","); 

int[] results = new int[items.length]; 

for (int i = 0; i < items.length; i++) { 
    try { 
     results[i] = Integer.parseInt(items[i]); 
    } catch (NumberFormatException nfe) { 
     //NOTE: write something here if you need to recover from formatting errors 
    }; 
} 
+8

你先生,值得一枚勳章!非常感謝!!我的字符串看起來像這樣:[[「1」,「2」],[「11」,「5」] ...] – Thomas

+1

這工作得很好,我只需要添加.replaceAll(「」,「」)爲我的字符串在數字之間有空格,例如'[1313,1314,1315]',而不用替換空格我會把我的int []當成'[1313,0,0]' – Tomas

15
final String[] strings = {"1", "2"}; 
    final int[] ints = new int[strings.length]; 
    for (int i=0; i < strings.length; i++) { 
     ints[i] = Integer.parseInt(strings[i]); 
    } 
+5

這是一個很好的簡潔的實現方法。儘管如此,我當然非常失望,Java顯然沒有想到它的一個庫中有單行版本。 –

5

它看起來像JSON - 這可能是矯枉過正,視情況而定,但你可以考慮使用JSON庫(如http://json.org/java/)來分析它:

String arr = "[1,2]"; 

    JSONArray jsonArray = (JSONArray) new JSONObject(new JSONTokener("{data:"+arr+"}")).get("data"); 

    int[] outArr = new int[jsonArray.length()]; 

    for(int i=0; i<jsonArray.length(); i++) { 
     outArr[i] = jsonArray.getInt(i); 
    } 
41

使用Java 8的流庫,我們可以做這一個班輪(儘管是長線):

String str = "[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]"; 
int[] arr = Arrays.stream(str.substring(1, str.length()-1).split(",")) 
    .map(String::trim).mapToInt(Integer::parseInt).toArray(); 
System.out.println(Arrays.toString(arr)); 

substring去掉括號,split陣列分離元素,trim刪除數字周圍的任何空格,parseInt解析每個數字,然後將結果轉儲到數組中。我已經包含了trim以使其與Arrays.toString(int[])相反,但是它也會解析沒有空白的字符串,如問題中所示。如果您只需要解析來自Arrays.toString的字符串,則可以省略trim並使用split(", ")(注意空格)。

+4

聰明。雖然看起來像代碼高爾夫! – voidHead

+0

感謝您將此添加爲答案 –

0

在緊密循環或移動設備中,通過短暫的String對象生成大量垃圾並不是一個好主意,尤其是在解析長數組時。

我的答案中的方法解析數據而不生成垃圾,但它不會正常處理無效數據,也無法解析負數。 如果您的數據來自不可信來源,您應該進行一些額外的驗證或使用其他答案中提供的替代方法之一。

public static void readToArray(String line, int[] resultArray) { 
    int index = 0; 
    int number = 0; 

    for (int i = 0, n = line.length(); i < n; i++) { 
     char c = line.charAt(i); 
     if (c == ',') { 
      resultArray[index] = number; 
      index++; 
      number = 0; 
     } 
     else if (Character.isDigit(c)) { 
      int digit = Character.getNumericValue(c); 
      number = number * 10 + digit; 
     } 
    } 

    if (index < resultArray.length) { 
     resultArray[index] = number; 
    } 
} 

public static int[] toArray(String line) { 
    int[] result = new int[countOccurrences(line, ',') + 1]; 
    readToArray(line, result); 
    return result; 
} 

public static int countOccurrences(String haystack, char needle) { 
    int count = 0; 
    for (int i=0; i < haystack.length(); i++) { 
     if (haystack.charAt(i) == needle) { 
      count++; 
     } 
    } 
    return count; 
} 

countOccurrences implementation was shamelessly stolen from John Skeet

0

您可以通過使用在java.util包中定義StringTokenizer類很容易做到這一點。

void main() 
    { 
    int i=0; 
    int n[]=new int[2];//for integer array of numbers 
    String st="[1,2]"; 
    StringTokenizer stk=new StringTokenizer(st,"[,]"); //"[,]" is the delimeter 
    String s[]=new String[2];//for String array of numbers 
    while(stk.hasMoreTokens()) 
    { 
     s[i]=stk.nextToken(); 
     n[i]=Integer.parseInt(s[i]);//Converting into Integer 
     i++; 
    } 
    for(i=0;i<2;i++) 
    System.out.println("number["+i+"]="+n[i]); 
} 

輸出:-number [0] = 1 數[1] = 2

1

索爾的答案,可以更好地實現分束字符串是這樣的:

string = string.replaceAll("[\\p{Z}\\s]+", ""); 
String[] array = string.substring(1, string.length() - 1).split(",");