2017-08-29 2 views
0

J'ai ce Réduire fonction:bug bizarre avec chaîne de commutation sur la carte-reduce java

public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException { 
    for (Text value: values){ 
     Matrix matrix = new Matrix(value.toString()); 
     String name = matrix.get_name(); // Return "A" or "B" 
     context.write(key, new Text(name)); 
    } 

}

L'exécution de ce bloc de code m'a donné quelque chose comme (ce qui est logique):

0,0 A 
0,1 A 
... 
0,0 B 
... 

Puis quand j'ai essayé de commutation de la valeur du "nom":

public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException { 
    for (Text value: values){ 
     Matrix matrix = new Matrix(value.toString()); 
     String name = matrix.get_name(); // Return "A" or "B" 
     switch (name){ 
      case "A": 
       context.write(key, new Text("AA")); 
       break; 
      case "B": 
       context.write(key, new Text("BB")); 
       break; 
      default: 
       context.write(key, new Text("CC")); 
       break; 
     } 
    } 
} 

Le code ci-dessus m'a donné ce résultat:

0,0 CC 
0,1 CC 
... 

Ce que je ne comprends pas pourquoi mon instruction switch fonctionne dans ce cas (en utilisant égal à comparer ne fonctionne pas non plus)

Tous les pointeurs pour résoudre ce problème?

Votre aide sera appréciée.

// Mise à jour:

Utiliser trim() et equalsIgnoreCase() ne fonctionnent pas non plus:

if ("A".equalsIgnoreCase(name.trim())){ 
    context.write(key, new Text("AA")); 
} 
else if ("B".equalsIgnoreCase(name.trim())){ 
    context.write(key, new Text("BB")); 
} 
else{ 
    context.write(key, new Text("CC")); 
} 
+0

Il est préférable d'utiliser sinon else et égal à la place de l'instruction switch pour que le compilateur utilise des méthodes équivalentes pour comparer les chaînes. Je recommande également trim() et equalsIgnoreCase() si le cas n'est pas important. Également imprimer la sortie pour voir pourquoi il n'est pas égal à votre A ou B. –

+0

@KillerDeath vous devriez écrire cela comme la réponse, parce que c'est presque certainement correct. –

+0

Oui, il doit être que, pas beaucoup d'options ici, merci pour des conseils –

Répondre

1

Ne pas comparer les chaînes à l'aide de l'instruction switch, garniture d'utilisation() et equalsIgnoreCase() dans ce ordre combiné avec sinon, bien sûr.

if(name.trim().equalsIgnoreCase("A"){...} 

else if name.trim().equalsIgnoreCase("B"){...} 
else ... 
+0

ne fonctionne pas, voir ma mise à jour – Forrest

+0

Quand le nom devrait Soit par exemple "A", imprimez-le pour voir ce que c'est. Est-ce que "si" approprié déclenche un point d'arrêt? –