2010-10-06 4 views
2

Je veux extraire le nombre et ajouter ces nombres en utilisant Java et la chaîne reste même.Comment extraire le nombre et la chaîne dans Java

Chaîne AS-

String msg="1,2,hello,world,3,4"; 

sortie devrait venir comme- 10, bonjour, monde

Merci

+0

tous sont reclus par commma? –

+1

Je crois qu'une expression régulière fera l'affaire ici. – Sid

Répondre

1
String[] parts = msg.split(","); 
int sum = 0; 
StringBuilder stringParts = new StringBuilder(); 
for (String part : parts) { 
    try { 
     sum += Integer.parseInt(part); 
    } catch (NumberFormatException ex) { 
     stringParts.append("," + part); 
    } 
} 
stringParts.insert(0, String.valueOf(sum)); 

System.out.println(stringParts.toString()); // the final result 

Notez que la pratique ci-dessus en utilisant des exceptions que le flux de contrôle doit être évité presque toujours. Ce cas concret est je crois une exception, car il n'y a pas de méthode qui vérifie la "parsabilité" de la chaîne. S'il y avait Integer.isNumber(string), alors ce serait le chemin à parcourir. En fait, vous pouvez créer une telle méthode utilitaire. Vérifiez this question.

+3

Ne pas se fier aux exceptions pour contrôler le flux du programme est une mauvaise pratique? Dans le cas contraire, cela ressemble à une solution assez simple et simpliste avec une complexité proche de zéro. – vstoyanov

+0

@vstoyanov il y avait une discussion sur ce cas spécifique (avec des numéros d'analyse/date), laissez-moi le trouver. Généralement, oui, c'est une mauvaise pratique de s'appuyer sur des exceptions, mais puisqu'il n'y a aucune méthode pour vérifier la parsabilité. – Bozho

+0

Merci pour la réponse. –

5

Cassez votre problème:

  1. analyse syntaxique en jetons
  2. conversion des jetons en objets
  3. fonctionnent sur des objets
+1

+1 pour encourager l'OP à penser/coder pour lui-même – Qwerky

+0

Merci, Qwerky. Très appréciée. – duffymo

5
String pieces[] = msg.split(","); 
int sum=0; 
StringBuffer sb = new StringBuffer(); 
for(int i=0;i < pieces.length;i++){ 

     if(org.apache.commons.lang.math.NumberUtils.isNumber(pieces[i])){ 
      sb.appendpieces[i](); 
     }else{ 
      int i = Integer.parseInt(pieces[i])); 
      sum+=i;  
     } 

} 
System.out.println(sum+","+sb.); 
} 
+1

-1 N'utilisez jamais d'exceptions pour le contrôle de flux! – helpermethod

+0

@Helper Méthode FYI mis à jour le code. –

+0

+1 pour 'isNumber' – Bozho

0

Voici une très simple version regex:

/** 
* Use a constant pattern to skip expensive recompilation. 
*/ 
private static final Pattern INT_PATTERN = Pattern.compile("\\d+", 
    Pattern.DOTALL); 

public static int addAllIntegerOccurrences(final String input){ 
    int result = 0; 
    if(input != null){ 
     final Matcher matcher = INT_PATTERN.matcher(input); 
     while(matcher.find()){ 
      result += Integer.parseInt(matcher.group()); 
     } 
    } 
    return result; 

} 

Code d'essai:

public static void main(final String[] args){ 
    System.out.println(addAllIntegerOccurrences("1,2,hello,world,3,4")); 
} 

Sortie:

Avertissements:

Cela ne fonctionnera pas si le n les ombres s'ajoutent à quelque chose de plus grand que Integer.Max_VALUE, évidemment.

Questions connexes