Преобразовать строку в массив int в java

у меня одна струна

String arr= "[1,2]";

т.е. "[1,2]" похож на одну строку

Как преобразовать этот массив в массив int в java


person Deepak Kumar    schedule 04.10.2011    source источник
comment
Код вашего примера не компилируется. Пожалуйста, исправьте это. Тем не менее, взгляните на StringTokenizers: download.oracle .com/javase/6/docs/api/java/util/   -  person Kilian Foth    schedule 04.10.2011
comment
Вы ясно представляете, что вы действительно хотите сделать?   -  person Mohamed Saligh    schedule 04.10.2011
comment
Почему 8 голосов против...??   -  person Gokul Nath KP    schedule 18.10.2013
comment
Потому что вопрос неясен. [1,2] не является допустимой строкой, а код, на котором основан весь вопрос, не является допустимым java.   -  person The Pellmeister    schedule 28.10.2013
comment
Не понимаю, почему за этот вопрос проголосовали. Это совершенно ясно: преобразовать String, который имеет следующий формат: [#,#,#,#,...,#] в int[]   -  person Alex Semeniuk    schedule 23.01.2014
comment
Полезный, четкий вопрос, на который мне нужен ответ гораздо позже. Более 50 тысяч просмотров говорят о качестве вопроса. +1.   -  person La-comadreja    schedule 29.06.2014


Ответы (9)


Используя потоковую библиотеку 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(", ") (обратите внимание на пробел).

person Jeffrey Bosboom    schedule 15.09.2014
comment
Спасибо, что добавили это как ответ - person Bugs Happen; 11.10.2015

Это похоже на 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);
    }
person mseebach    schedule 04.10.2011

Ответ Саула можно лучше реализовать, разделив строку следующим образом:

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

попробуй этот, может тебе пригодится

String arr= "[1,2]";
int[] arr=Stream.of(str.replaceAll("[\\[\\]\\, ]", "").split("")).mapToInt(Integer::parseInt).toArray();
person Deepesh Kumar    schedule 03.11.2018
comment
Привет, добро пожаловать в StackOverflow. Учитывая, что это довольно старый вопрос с множеством популярных ответов, отредактируйте свой вопрос, чтобы объяснить, что дает ваш ответ, чего нет в существующих. Спасибо. - person MandyShaw; 04.11.2018
comment
Ваш ответ не работает должным образом с такими записями, как "[123, 456]" - person Olivier Grégoire; 04.11.2018
comment
Пожалуйста, проверьте это сейчас! - person Deepesh Kumar; 04.11.2018
comment
Я думаю, что @OlivierGrégoire имеет в виду, что код работает, только если каждый элемент представляет собой одну цифру. Но для этого нужна лишь небольшая настройка: Stream.of(str.replaceAll("[\\[\\]\\ ]", "").split(",")).mapToInt(Integer::parseInt).toArray() - person David Easley; 08.12.2019

Вы можете легко сделать это, используя класс StringTokenizer, определенный в пакете java.util.

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

Вывод: -число[0]=1 число[1]=2

person Community    schedule 08.02.2015

В узких циклах или на мобильных устройствах не рекомендуется генерировать много мусора с помощью недолговечных 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 была беззастенчиво украдена у Джона Скита

person Juozas Kontvainis    schedule 12.12.2014

Если вы предпочитаете массив Integer[] вместо массива int[]:

Целое[]

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

число[]

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 и выше.

person flavio.donze    schedule 09.06.2020

person    schedule
comment
Вы, сэр, заслуживаете медали! Спасибо большое!! моя строка выглядела так: [[1,2],[11,5]...] - person Thomas Schwärzl; 12.08.2012
comment
это сработало хорошо, мне просто нужно было добавить .replaceAll( , ), поскольку в моей строке были пробелы между числами, например [1313, 1314, 1315] , без замены пробелов я получил бы свой int[] как [1313, 0, 0] - person Tomas; 18.01.2016
comment
String[] items = arr.replaceAll("\\[", "").replaceAll("\\]", "").replaceAll("\\s", "").split(","); можно заменить на String[] items = arr.replaceAll("\\[|\\]|\\s|,", "") Только что закончил свой класс регулярного выражения :) - person evuazeze; 20.04.2021

person    schedule
comment
Хороший краткий способ реализовать это. Однако я определенно разочарован тем, что Java, по-видимому, не подумал об однострочнике в одной из своих библиотек для этого. - person La-comadreja; 29.06.2014