2011-10-04 23 views
45

Mam jeden ciągKonwersja String na int tablicy w java

String arr= "[1,2]"; 

czyli "[1,2]" jest jak jeden ciąg

Jak przekonwertować to arr int tablicy w java

+4

pisać poprawną przykład java . –

+0

czy to jest zadanie domowe? –

+1

Twój przykładowy kod nie jest kompilowany. Proszę napraw to. To powiedziawszy, spójrz na StringTokenizers: http://download.oracle.com/javase/6/docs/api/java/util/StringTokenizer.html –

Odpowiedz

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

sir, zasłużyć na medal! Dziękuję bardzo!!mój ciąg wyglądał tak: [["1", "2"], ["11", "5"] ...] – Thomas

+1

to działało dobrze, po prostu musiałem dodać .replaceAll ("", "") jako mój ciąg miał spacje między liczbami, np. "[1313, 1314, 1315]", bez zastępowania spacji dostałbym moje int [] jako '[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

Niezwykle zwięzły sposób na zaimplementowanie tego. Zdecydowanie jestem jednak rozczarowany, że Java najwyraźniej nie pomyślała o jednej linijce w jednej z jej bibliotek. –

5

wygląda JSON - to może być przesada, w zależności od sytuacji, ale można rozważyć przy użyciu biblioteki JSON (np http://json.org/java/), aby go przetworzyć:

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

Korzystanie strumienia biblioteki Java 8, możemy zrobić to jedno-liner (choć długiej linii):

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 usuwa wsporniki, split oddziela tablicę elements, trim usuwa wszelkie spacje wokół numeru, parseInt analizuje każdy numer, a my zrzucamy wynik w postaci tablicy. Zawarłem trim, aby uczynić to odwrotnością Arrays.toString(int[]), ale będzie to również analizować ciągi bez spacji, jak w pytaniu. Jeśli potrzebujesz tylko do analizy łańcuchów od Arrays.toString, możesz pominąć trim i użyć split(", ") (zwróć uwagę na spację).

+4

Sprytny. Wygląda jak kod golfa! – voidHead

+0

Dziękujemy za dodanie tej odpowiedzi –

0

W ciasnych pętlach lub na urządzeniach przenośnych nie jest dobrym pomysłem generowanie dużej ilości śmieci poprzez krótkotrwałe obiekty String, szczególnie podczas analizowania długich tablic.

Metoda w mojej odpowiedzi analizuje dane bez generowania śmieci, ale nie radzi sobie z niepoprawnymi danymi i nie może analizować liczb ujemnych. Jeśli Twoje dane pochodzą z niezaufanego źródła, powinieneś przeprowadzić dodatkową walidację lub użyć jednej z alternatyw podanych w innych odpowiedziach.

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

Można to łatwo zrobić za pomocą klasy StringTokenizer zdefiniowany w pakiecie 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]); 
} 

wyjściowa: -liczba [0] = 1 numer [1] = 2

1

odpowiedź Saula może być lepiej realizowane dzielenie ciąg tak:

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