2013-01-31 3 views
0

J'ai un tableau d'objets à deux dimensions (Object [] [] data) qui contient des paires de produits-prix.
J'essaie de transmettre ces valeurs à une carte de la manière suivante.convertir un objet qui contient un double à une chaîne, puis de nouveau à double

private String myPairs = ""; 
private String[] l, m; 

for (int i=0; i<data.length; i++){ 
    myPairs += (String)data[i][0] + ":" + String.valueOf(data[i][1]) + ","; 
} 

Map<String, Double> pairs = new java.util.HashMap<>(); 
l = myPairs.split(","); 

for (int i=0; i<l.length; i++){ 
    m = l[i].split(":"); 
    pairs.put((String)m[0], Double.parseDouble((String)m[1]));    
} 

Je reçois un java.lang.ArrayIndexOutOfBoundsException. Quel est le problème que j'ai fait?

+0

sur quelle ligne vous obtenez 'ArrayIndexOutOfBound', allez aussi à travers votre débogueur et vous pouvez résoudre vous-même .. :) – PermGenError

+0

sur? line pairs.put ((String) m [0], ....) – Stanos

+1

tains dans les données d'objet ??? – alnasfire

Répondre

2

Try

for (int i=0; i<l.length-1; i++){ 
    m = l[i].split(":"); 
    pairs.put((String)m[0], Double.parseDouble((String)m[1]));    
} 
+0

Il peut être utile de fournir quelques explications (sinon, les gens peuvent mal comprendre/ne pas comprendre (et éventuellement voter en bas, comme cela est arrivé ici)). – Dukeling

1

Lorsque les premiers pour-boucle extrémités, on a toutes les paires séparées par « », et un supplément de « » à la fin. Donc, l.length est le nombre de paires plus un. Cependant, cela ne devrait pas produire d'erreur jusqu'à présent. Le problème est que lorsque vous divisez chaque paire sur ':', le dernier élément de l est égal à une chaîne vide. La division produit donc un tableau à 1 élément contenant une chaîne vide. L'erreur se produit parce que vous demandez m[1]. Essayez de ne pas ajouter le signe ',' après le dernier élément des paires, et le problème devrait être résolu.

J'espère que cette aide :)

1

Le dernier élément de la scission de , s est vide (parce que vous dites + "," à la dernière itération de la première boucle), donc sauter le dernier élément dans la seconde boucle.

for (int i = 0; i < l.length-1; i++) 
{ 
    m = l[i].split(":"); 
    pairs.put((String)m[0], Double.parseDouble((String)m[1]));    
} 

Notez également que si les chaînes fournies contient : s ou , s, votre algorithme serait probablement lancer une exception aussi.

Remarque - Une façon meilleure façon (et d'éviter ce qui précède) serait juste de le faire dans la première boucle, quelque chose comme:

for (int i = 0; i < data.length; i++) 
{ 
    pairs.put((String)data[i][0], Double.parseDouble((String)data[i][1])); 
} 
2

problème Vous est ici:

pairs.put((String)m[0], Double.parseDouble((String)m[1])); 

La première boucle for crée une chaîne qui se termine par ,. Par exemple "foo:0.1,bar:0.2,".

Ensuite, vous avez divisé par ,. Ainsi, l'exemple ci-dessus renverra ["foo:0.1"; "bar:0.2"; ""]. Notez la valeur de chaîne vide, en raison de la dernière , de la chaîne. Pour chaque valeur, vous divisez par :. Cela fonctionne pour les deux premières valeurs (c'est-à-dire ["foo"; "0.1"] et ["bar"; "0.2"]), mais le dernier sera un tableau à 1 valeur, contenant une chaîne vide: [""]. Lorsque vous tentez d'accéder à la seconde valeur du tableau (c'est-à-dire l'index 1 étant donné que les tableaux sont indexés sur 0), le ArrayIndexOutOfBoundsException est envoyé.


Plusieurs solutions:

Dans la première boucle, mettre une condition pour ajouter le , ou non:

myPairs += (i == 0 ? "" : ",") + (String)data[i][0] + ":" + String.valueOf(data[i][1]); 

OU Juste après votre première boucle, retirez le dernier caractère de la chaîne:

myPairs = myPairs.substring(0, myPairs.length() - 1); 

OU Dans la deuxième boucle, ne vont pas jusqu'à la dernière valeur, mais seulement jusqu'à ce que le n-1 un:

for (int i=0; i<l.length - 1; i++) 

OU encore mieux, que si vous n'avez pas besoin de la chaîne représentation vous construisez dans la première boucle, remplacer tout votre code par:

for (int i=0; i<data.length; i++) { 
    pairs.put((String)data[i][0], Double.parseDouble((String)data[i][1])); 
} 
Questions connexes