2010-10-28 14 views
3

Je veux tester si le char actuel actuel n'est pas ',', '-', '.' ou '' Y at-il une expression plus courte pour:Conditions courtes, java

if((current != ' ') || (current != '.') || ...) 

des idées?

EDIT:

Je suis juste le droit d'utiliser les méthodes nextChar et getchar. Je dois faire une boucle à travers les caractères.

import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStreamReader; 

public class WoerterZaehlen { 
    public static void main(String[] args) { 
     int wordCount = 0; 
     /* Ab hier dürft ihr eigenen Code einfügen */ 
     char previous = ' '; 
     while(hasNextChar()){ 
      char current = getChar(); 
      if(current !=) 
      //if(((current == ' ') || (current == '.') || (current == ',')) && ((previous != ' ') && (previous != ','))){ 
      // wordCount++; 
      //} 
      previous = current;   
     } 
     /* Ab hier dürft ihr nichts mehr ändern. */ 
     System.out.println("Anzahl der Wörter: " + wordCount); 
    } 

    private static InputStreamReader reader; 
    private static int next = -1; 

    public static boolean hasNextChar() { 
     if(next != -1) 
      return true; 
     try { 
      if(reader == null) 
       reader = new InputStreamReader(new FileInputStream("textdatei.txt")); 
      next = reader.read(); 

     } catch (IOException e) { 
      System.out.println("Datei wurde nicht gefunden."); 
     } 
     return next != -1; 
    } 

    public static char getChar() { 
     char c = (char) next; 
     next = -1; 
     return c; 
    } 
} 
+0

Je pense que vous voulez dire && plutôt que ||. –

+1

Pourquoi l'avez-vous tagué avec "optimisation"? L'expression la plus courte ne sera probablement pas la plus optimale en termes de performance. –

+0

J'ai vu votre édition.Je pense que vous devez utiliser la classe Scanner. Elle a déjà des fonctions pour nextChar et getChar. – Emil

Répondre

2

si vous n'êtes pas autorisé à utiliser String.indexOf comme dans:

if (" .,".indexOf(ch) != -1) { 
     /* do something */ 
    } else { 
     /* do if none of the above */ 
    } 

utiliser un commutateur comme dans

switch (ch) { 
     case ' ': case '.': case ',': /* do something */ break; 
     default: /* do if none of the above */ break; 
    } 

(au lieu d'enregistrer le caractère précédent, vous pourriez juste utilisez un booléen pour indiquer si le caractère précédent était une limite de mot ou un caractère de mot légal)

+0

merci, mais par ex. J'ai "Merci" et il ne compterait que 1 mot parce que "Merci" n'a aucun caractère à la fin que je pourrais utiliser pour identifier la fin ... –

+0

@ArtWorkAD - c'est un autre problème, pas ce qui a été demandé .. mais facile à résoudre car 'previous' ou le booléen est déclaré en dehors de la boucle, vous pouvez le vérifier pour décider s'il y a un mot supplémentaire après la fin de la boucle. –

13

Try

String prohibitedChars = ",-. "; 
boolean isProhibited = prohibitedChars.indexOf('-') > -1; 

Je nettoyé jusqu'à paraître un peu agréable, mais si vous êtes vraiment après court tout ce que vous avez besoin est:

",-. ".indexOf('-') > -1; 

EDIT:

Vous pouvez toujours utiliser cette approche même si vous êtes limité à getChar() et h asNextChar()

while(hasNextChar()){ 
    char current = getChar(); 
    if (",-. ".indexOf(current) > -1) { 
     wordCount++; 
    } 
    previous = current;   
} 
+0

Simple et clair, +1. –

+0

désolé j'ai raté dans ma description mais je suis juste autorisé à utiliser les méthodes nextChar et getChar. Je dois faire une boucle à travers les caractères. –

+0

Pas de soucis ArtWorkAD. Mise à jour ma réponse pour correspondre à votre question révisée. – Synesso

0

ou si vous voulez être ridicule de mettre les caractères dans un BitSet statique et utilisez isset (en cours).

À moins que ce code ne soit exécuté des millions de fois, je m'en tiens à ce que vous avez, car la clarté du code est plus importante que les gains de performance non mesurables.

2

S'il s'agit d'une chaîne entière en boucle, vous pouvez envisager d'utiliser des expressions régulières.

Un exemple de valider avec regex: Checking String for illegal characters using regular expression

L'exemple est liste blanche de caractère plutôt que des listes noires. Ce serait dans la plupart des cas l'option préférée car il y a beaucoup plus de catégories de caractères juridiques que d'illégales.

4
BitSet unwantedChars=new BitSet(); 
    unwantedChars.set('.'); 
    unwantedChars.set(','); 
    unwantedChars.set('-'); 
    unwantedChars.set(' '); 
    char current=','; 
    if(unwantedChars.get(current)) //true if unwanted char else false 
    { 
    //.... 
    } 

Utilisation de Google Goyave:

CharMatcher unwantedChars=CharMatcher.anyOf("-,. ").precomputed(); 
    unwantedChars.apply(',');//true if unwanted char else false 
0

étant donné que plusieurs fournissent d'autres solutions, je fournirai celle que vous utiliseriez sans limitations.

String prohibitedChars = ",-. "; 
prohibitedChars.contains(char);