2010-06-01 6 views
0

il peut être une question nooby, mais je ne l'ai jamais besoin avant:switch-case Permutation FLE extra/structure de données (Java)

J'ai plusieurs cordes et je veux les comparer à ceux donnés.

À première vue, cela conduirait à une construction commutateur/boîtier dans ce que chaque entrée disponible est vérifiée. Y at-il un moyen plus élégant d'échanger ces chaînes en tant que données clé/valeur?

Salue, poeschlorn

Répondre

1

Mise à jour: Mon mauvais. J'ai mal lu cette recherche insensible à la casse.

La sensibilité à la casse est facile. Java ne prend pas encore en charge String s dans les instructions switch. La solution est plus facile:

if (string1.equals(string2)) { 
    ... 
} else if (string1.equals(string3)) { 
    ... 
} 

Ou comme une boucle:

String[] matches = new String[] { 
    "abcd", 
    "efgh", 
    "ijkl" 
}; 

for (String match : matches) { 
    if (matches.equals(string)) { 
    ... 
    } 
} 

Bien sûr, cela est linéaire (O (n)) et ne pas l'échelle, mais est simple et suffit pour le plus simple des cas. Une meilleure solution est d'utiliser une recherche par hachage:

Set<String> matches = new HashSet<String>(); 
matches.add("abcd"); 
matches.add("efgh"); 
matches.add("ijkl"); 

if (matches.contains(string1)) { 
    ... 
} 

Ceci est quasi linéaire (O (1)) recherche et échelle beaucoup mieux avec un grand nombre de String s.

+0

S'il y a beaucoup de chaînes, votre mécanisme d'appariement sera plutôt lent - O (n) - alors que l'utilisation d'un HashSet ou d'un HashMap prédéfini donnera une recherche O (1) attendue. –

3

Oui, utilisez les chaînes comme clés dans un HashMap, et faites correspondre les valeurs correspondantes aux objets définissant l'action à effectuer si la clé a été trouvée, sauf si vous n'avez qu'un seul comportement, auquel cas vous pouvez simplement utiliser un HashSet , testez si la chaîne est dans l'ensemble, puis prenez les mesures en conséquence.

+0

Trop compliqué étant donné que l'appariement est insensible à la casse à moins qu'il n'y ait un ensemble de chaînes suffisamment grand pour correspondre à justifier la complexité. – cletus

+0

@cletus, où le PO dit-il qu'il doit être insensible à la casse? Et si elle doit être insensible à la casse, utilisez simplement des minuscules dans la carte ou des valeurs minuscules dans l'ensemble, puis convertissez la chaîne d'entrée en minuscules avant d'effectuer la recherche. –

+0

ma mauvaise. J'ai mal lu la question. – cletus