У меня есть одна строка
String arr= "[1,2]";
ie "[1,2]" как одна строка
Как преобразовать этот arr в массив int в java
У меня есть одна строка
String arr= "[1,2]";
ie "[1,2]" как одна строка
Как преобразовать этот arr в массив int в java
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
};
}
Используя библиотеку потоков 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(", ")
(обратите внимание на пробел).
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]);
}
Похоже, что 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);
}
Ответ Saul может быть лучше реализован, разделив строку следующим образом:
string = string.replaceAll("[\\p{Z}\\s]+", "");
String[] array = string.substring(1, string.length() - 1).split(",");
В жестких петлях или на мобильных устройствах не рекомендуется создавать много мусора через недолговечные объекты 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 было бесстыдно украдено у Джона Скита
Вы можете сделать это легко, используя класс 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]);
}
Выход: -number [0] = 1 Количество [1] = 2