2011-10-04 5 views
45

J'ai une chaîneString Convertir int tableau en Java

String arr= "[1,2]"; 

-à-dire "[1,2]" est comme une seule chaîne

Comment convertir cette arr n'int tableau en Java

+4

publier l'exemple java valide . –

+0

est-ce une question de devoirs? –

+1

Votre code d'exemple ne compile pas. Regle-le, s'il te plait. Cela dit, jetez un oeil à StringTokenizers: http://download.oracle.com/javase/6/docs/api/java/util/StringTokenizer.html –

Répondre

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

monsieur, méritez une médaille! Merci beaucoup!!ma chaîne ressemblait à ceci: [["1", "2"], ["11", "5"] ...] – Thomas

+1

cela a bien fonctionné, je devais juste ajouter .replaceAll ("", "") comme ma chaîne avait des espaces entre les nombres, par exemple '[1313, 1314, 1315]', sans remplacer les espaces, j'obtiendrais mon int [] comme '[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

Belle manière concise de mettre en œuvre ceci. Je suis certainement déçu, cependant, que Java n'a apparemment pas pensé à un one-liner dans une de ses bibliothèques pour cela. –

5

il ressemble à JSON - il pourrait être exagéré, selon la situation, mais vous pouvez envisager d'utiliser une bibliothèque JSON (par exemple http://json.org/java/) pour l'analyser:

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

En utilisant la bibliothèque de flux de Java 8, nous pouvons en faire une ligne unique (mais une longue ligne):

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 supprime les parenthèses, split sépare le tableau éléments, trim supprime tous les espaces autour du nombre, parseInt analyse chaque nombre, et nous vidons le résultat dans un tableau. J'ai inclus trim pour faire l'inverse de Arrays.toString(int[]), mais cela va également analyser les chaînes sans espace, comme dans la question. Si vous avez seulement besoin d'analyser les chaînes de Arrays.toString, vous pouvez omettre trim et utiliser split(", ") (notez l'espace).

+4

Clever. On dirait que le code de golf, cependant! – voidHead

+0

Merci d'ajouter ceci comme réponse –

0

Dans les boucles étroites ou sur les périphériques mobiles, il n'est pas judicieux de générer beaucoup de déchets à l'aide d'objets de courte durée String, en particulier lors de l'analyse de longues baies.

La méthode de ma réponse analyse les données sans générer de faille, mais elle ne gère pas correctement les données non valides et ne peut pas analyser les nombres négatifs. Si vos données proviennent de sources non fiables, vous devez effectuer une validation supplémentaire ou utiliser l'une des alternatives fournies dans d'autres réponses.

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

Vous pouvez le faire facilement en utilisant la classe StringTokenizer définie dans le package 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]); 
} 

Sortie: -nombre [0] = 1 nombre [1] = 2

1

réponse de Saül peut être mieux diviser mis en œuvre la chaîne comme ceci:

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