2009-09-16 4 views
2

En Java j'ai un objet java.util.Properties et je veux en obtenir un autre avec les mêmes paires mais les clés converties en valeurs et viceversa.Le plus court chemin pour inverser Propriétés

S'il y a collision (c'est-à-dire qu'il y a deux valeurs égales), il suffit de choisir comme valeur une clé arbitraire.

Quel est le moyen le plus court de le faire?

N'hésitez pas à utiliser des bibliothèques, des collections de communes, etc.

+0

Vous pouvez utiliser Java dans Code Golf? Je pensais que c'était juste Perl, PHP et Ruby. Non? – CPerkins

+0

J'ai enlevé l'étiquette de code-golf, car il ne me semble pas être le problème typique du golf de code, mais un vrai problème de monde qui doit être résolu. –

Répondre

2

Un objet Properties est un objet Hashtable, vous devriez donc être en mesure de faire quelque chose comme:

Hashtable<String, String> reversedProps = new Hashtable<String, String>(); 

for (String key : props.keySet()) { 
    reversedProps.put(props.get(key), key); 
} 

Résultat: 3 lignes de code.

Ce code n'a pas été testé, mais il devrait vous donner l'idée.

+0

'putAll' prend un' Map' comme argument, pas deux collections. Pour que cela fonctionne, vous avez besoin d'une «carte» «inversée». – gustafc

+0

En outre, c'est Hashtable, pas HashTable. – job

+0

Suppression de la solution 'putAll' - complètement abandonné la balle sur celui-là. Correction de l'erreur HashTable/Hashtable. –

1

Quelque chose comme:

Properties fowards = new Properties(); 
fowards.load(new FileInputStream("local.properties")); 

Properties backwards = new Properties(); 

for (String propertyName : fowards.stringPropertyNames()) 
{ 
    backwards.setProperty(forwards.get(propertyName), propertyName); 
} 
+0

Pouvez-vous utiliser fowards.propertyNames() dans la boucle for-each comme ça? J'ai toujours créé un objet en dehors de la boucle for-each et l'ai fait ainsi. Si vous le pouvez, je peux également supprimer une ligne de code de mon exemple. –

+0

@Thomas: oui, la boucle 'for' obtient l'objet' Iterable' avant de commencer l'itération. –

+1

'propertyNames' renvoie une' Enumeration ', pas un' Iterable ', et ne peut donc pas être itéré avec la construction foreach. 'stringPropertyNames', cependant, renvoie un' Set 'et peut être foreached. – gustafc

6

Vous pouvez envisager d'utiliser un BiMap par google collections qui est essentiellement une carte reversible. Il garantit l'unicité des clés ainsi que des valeurs.

Check it out . C'est le API

+2

Cela fonctionnerait en effet, puisque la classe 'Hashtable' de Java implémente l'interface' Map', vous pouvez créer une nouvelle BiMap et ensuite utiliser la méthode 'putAll()' pour charger l'objet 'Properties' dans le BiMap. –

Questions connexes