у меня одна струна
String arr= "[1,2]";
т.е. "[1,2]" похож на одну строку
Как преобразовать этот массив в массив int в java
у меня одна струна
String arr= "[1,2]";
т.е. "[1,2]" похож на одну строку
Как преобразовать этот массив в массив int в java
Используя потоковую библиотеку 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(", ")
(обратите внимание на пробел).
Это похоже на 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);
}
Ответ Саула можно лучше реализовать, разделив строку следующим образом:
string = string.replaceAll("[\\p{Z}\\s]+", "");
String[] array = string.substring(1, string.length() - 1).split(",");
попробуй этот, может тебе пригодится
String arr= "[1,2]";
int[] arr=Stream.of(str.replaceAll("[\\[\\]\\, ]", "").split("")).mapToInt(Integer::parseInt).toArray();
"[123, 456]"
- person Olivier Grégoire; 04.11.2018
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
В узких циклах или на мобильных устройствах не рекомендуется генерировать много мусора с помощью недолговечных 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 была беззастенчиво украдена у Джона Скита
Если вы предпочитаете массив 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 и выше.
[1313, 1314, 1315]
, без замены пробелов я получил бы свой int[] как [1313, 0, 0]
- person Tomas; 18.01.2016
String[] items = arr.replaceAll("\\[", "").replaceAll("\\]", "").replaceAll("\\s", "").split(",");
можно заменить на String[] items = arr.replaceAll("\\[|\\]|\\s|,", "")
Только что закончил свой класс регулярного выражения :)
- person evuazeze; 20.04.2021
[1,2]
не является допустимой строкой, а код, на котором основан весь вопрос, не является допустимым java. - person The Pellmeister   schedule 28.10.2013String
, который имеет следующий формат: [#,#,#,#,...,#] вint[]
- person Alex Semeniuk   schedule 23.01.2014