2011-10-04 54 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(",");