2010-06-07 12 views
1

Ma chaîne ressemble;remplacer des valeurs dans une chaîne à partir d'une table de hachage en Java

String values = "I am from UK, and you are from FR"; 

et ma hashtable;

Hashtable countries = new Hashtable(); 
countries.put("United Kingdom", new String("UK")); 
countries.put("France", new String("FR")); 

Quelle serait la façon la plus efficace de changer les valeurs de ma chaîne avec les valeurs de la table de hachage en conséquence. Ce ne sont que 2 valeurs à changer, mais dans mon cas, je vais avoir 100+

+2

Juste une « FYI "- Pourquoi utilisez-vous' new String ("UK") 'au lieu de simplement" UK "' '? Quelle différence pensez-vous que cela va faire? –

+2

La hashtable ne devrait-elle pas être l'inverse? Avec les noms courts comme clés, puisque ce sont ceux dont vous voulez trouver les noms longs. –

+0

Thanx @Jon Skeet Je viens de c/p les lignes et raté cette partie. @Andrei Fierbinteanu vous avez raison, ma mauvaise. – Adnan

Répondre

5

Je ne suis pas sûr qu'il y a beaucoup de choses que vous pouvez faire pour optimiser cela d'une manière qui en vaut la peine. En fait, vous pouvez construire un FSM pour des remplacements personnalisés comme ça, mais c'est probablement plus que ce que vous voulez vraiment faire.

Map<String, String> countries = new HashMap<String, String>(); 
countries.put("United Kingdom", "UK"); 
countries.put("France", "FR"); 
for (Map.Entry<String, String> entry : countries.entrySet()) { 
    values.replace(entry.getKey(), entry.getValue()); 
} 

Quelques notes:

  1. Ne pas utiliser Hashtable. Utilisez un Map (interface) et HashMap (classe) à la place; Déclarer les variables, les paramètres et les types de retour, le cas échéant, en tant qu'interface et non en tant que classe concrète;

  2. En supposant que vous utilisez Java 5, utilisez des arguments de type générique pour un code plus lisible. Dans ce cas, Map<String, String>, etc; et

  3. N'utilisez pas new String("UK"). Il n'y a pas besoin.

+0

Merci beaucoup @cletus pour vos conseils. – Adnan

+0

Dans ce cas, cela devrait être 'values.replace (entry.getValue(), entry.getKey())' parce que les noms courts sont des valeurs dans la carte. Bien que je ne sais pas pourquoi c'est ainsi. –

+0

Qu'est-ce qu'un FSM? (Google trouve ceci: http://en.wikipedia.org/wiki/Flying_Spaghetti_Monster) :-) –

2

Plusieurs pensées. Tout d'abord: pourquoi utiliser la hashtable? hashmap est généralement plus rapide car hashtable est synchronisé.

Ensuite: pourquoi ne pas utiliser des génériques?

HashMap<String, String> 

est beaucoup plus expressif que juste HashMap

Troisième: ne pas utiliser new String("UK"), "UK" fera bien, vous créez deux fois la même chaîne.

Mais pour résoudre votre problème, vous voulez probablement tourner la carte autour de:

Map<String,String> countries = new HashMap<String, String>(); 
countries.put("UK", "United Kingdom"); 
countries.put("FR", "France"); 

Maintenant, si je vous comprends bien, vous voulez faire quelque chose comme ceci:

String values = "I am from UK, and you are from FR"; 
for(Map.Entry<String, String> entry : countries.entrySet()){ 
    values = values.replace(entry.getKey(), entry.getValue()); 
}