在Java中将字符串转换为整型数组

67

我有一个字符串:

String arr = "[1,2]";

在Java中,如何将这个arr转换为整数数组?


1
你的示例代码无法编译,请修复它。另外,看一下StringTokenizer:http://download.oracle.com/javase/6/docs/api/java/util/StringTokenizer.html - Kilian Foth
你清楚自己真正想做什么吗? - Mohamed Saligh
为什么会有8个反对票...? - Gokul Nath KP
因为问题不清楚。[1,2] 不是一个有效的字符串,而且整个问题所基于的代码也不是有效的 Java 代码。 - Pelle
11
不明白为什么这个问题会被踩。它很清楚:将格式为[#,#,#,...,#]的字符串转换为int数组。 - Alex Semeniuk
1
这是一个有用、清晰的问题,我需要它的答案,虽然现在已经晚了很多。50K+ 的浏览量已经充分说明了这个问题的质量。+1。 - La-comadreja
11个回答

105
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 Schwärzl
2
这个很好用,我只需要添加.replaceAll(" ", "")因为我的字符串中数字之间有空格,例如 [1313, 1314, 1315],如果不替换空格,我的int[]将会是 [1313, 0, 0] - Tomas
String[] items = arr.replaceAll("\\[", "").replaceAll("\\]",",").replaceAll("\\s", "").split(","); 可以被替换为 String[] items = arr.replaceAll("\\[|\\]|\\s|,", ""); 刚刚完成了我的正则表达式课程 :) - evuazeze

60
使用Java 8的stream库,我们可以将其变成一行代码(虽然很长):
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(", ")(请注意空格)。


感谢您将此作为答案添加。 - Bugs Happen

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]);
    }

7
实现这个的方式很简洁。但是,我确实感到失望,因为 Java 似乎没有想到在其库中提供一行代码的解决方案。 - La-comadreja

7

看起来像是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);
    }

3

试一下这个,它可能对你有帮助

String arr= "[1,2]";
int[] arr=Stream.of(str.replaceAll("[\\[\\]\\, ]", "").split("")).mapToInt(Integer::parseInt).toArray();

1
你好,欢迎来到StackOverflow。鉴于这是一个相当古老的问题,并且有很多受欢迎的答案,请编辑您的问题以解释您的答案提供了哪些现有答案没有的内容。谢谢。 - MandyShaw
你的答案对于像"[123, 456]"这样的条目无法正常工作。 - Olivier Grégoire
please check it now ! - Deepesh Kumar
我认为@OlivierGrégoire想表达的意思是,如果每个元素只有一个数字,那么代码才能正常运行。但只需要进行一点小调整即可: Stream.of(str.replaceAll("[\\[\\]\\ ]", "").split(",")).mapToInt(Integer::parseInt).toArray() - David Easley

2

将Saul的回答分解为以下形式可以更好地实现字符串的拆分:

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

1
您可以使用在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 number[1]=2


1
    String str = "1,2,3,4,5,6,7,8,9,0";
    String items[] = str.split(",");
    int ent[] = new int[items.length];
    for(i=0;i<items.length;i++){
        try{
            ent[i] = Integer.parseInt(items[i]);
            System.out.println("#"+i+": "+ent[i]);//Para probar
        }catch(NumberFormatException e){
            //Error
        }
    }

1
如果您更喜欢 Integer[] 而不是 int[] 数组: < p > Integer[]

String str = "[1,2]";
String plainStr = str.substring(1, str.length()-1); // clear braces []
String[] parts = plainStr.split(","); 
Integer[] result = Stream.of(parts).mapToInt(Integer::parseInt).boxed().toArray(Integer[]::new);

int[]

String str = "[1,2]";
String plainStr = str.substring(1, str.length()-1); // clear braces []
String[] parts = plainStr.split(","); 
int[] result = Stream.of(parts).mapToInt(Integer::parseInt).toArray()

这适用于Java 8及更高版本。


0
在紧密的循环或移动设备上,通过短暂的字符串对象生成大量垃圾不是一个好主意,特别是当解析长数组时。
我的答案中的方法可以解析数据而不生成垃圾,但它不能优雅地处理无效数据并且不能解析负数。如果您的数据来自不受信任的来源,则应进行一些额外的验证或使用其他答案中提供的替代方法。
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的实现是毫不羞耻地从John Skeet那里偷来的


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接