J'utilise la méthode toString
de ArrayList
pour stocker les données ArrayList
dans une chaîne. Ma question est, comment puis-je aller dans l'autre sens? Existe-t-il une méthode existante qui va analyser les données dans l'instance String
dans un ArrayList
?Quelle est l'inverse de (ArrayList) .toString pour une Java ArrayList?
Répondre
La réponse courte est "Non". Il n'existe aucun moyen simple de réimporter un objet à partir d'une chaîne, car certaines informations de type sont perdues dans la sérialisation toString()
.
Cependant, pour des formats spécifiques et des types spécifiques (connus), vous devriez être en mesure d'écrire du code pour analyser une chaîne manuellement:
// Takes Strings like "[a, b, c]"
public List parse(String s) {
List output = new ArrayList();
String listString = s.substring(1, s.length() - 1); // chop off brackets
for (String token : new StringTokenizer(listString, ",")) {
output.add(token.trim());
}
return output;
}
objets Reconstituer de leur forme sérialisée est généralement appelé désérialisation
Dans ce cas, j'utilisais des chaînes, donc je suppose que l'analyser moi-même est assez simple. Je vous remercie. – user174772
Bien sûr, cela ne fonctionnerait que si les chaînes ne contiennent pas elles-mêmes les virgules, ce qui est le premier point de ma réponse. –
Personnellement, je créerais une classe Codec pour cela, donc il est possible de paramétrer la classe (plus tard) et de vérifier les codages bons/mauvais spécifiques. –
Je recommanderais plutôt d'utiliser un format standard avec une bibliothèque.
JSON est probablement le plus proche syntaxiquement.
Une autre solution XML ou de sérialisation pourrait également fonctionner. Tout dépend de vos besoins bien sûr.
Le format List.toString() est assez différent de JSON. En fait, c'est très simple (et beaucoup moins puissant). L'utilisation d'une bibliothèque JSON est exagérée (et probablement juste fausse). –
L'implémentation de son propre analyseur buggé est fausse. Utiliser une bibliothèque testée est toujours mieux. – iny
Voici une question similaire:
Reverse (parse the output) of Arrays.toString(int[])
Cela dépend de ce que vous stockez dans le ArrayList, et si oui ou non ces objets sont facilement reconstruit à partir de leurs représentations de chaîne.
De quoi est composé ArrayList? Comme d'autres ont dit, il peut être impossible dans certains cas, mais tout à fait possible et garantie de travailler si:
chaque représentation de chaîne de l'élément du tableau peut être identifié sans ambiguïté (comme il peut être par exemple si la ArrayList se compose de
Integer
s)Il existe un moyen de créer un objet de type original à partir de sa représentation String. Je trouve la plus élégante de le faire en utilisant une méthode statique
fromString
Bien sûr, cela imite le cadre de sérialisation ensemble (de).
Apache Commons ftw.
Arrays.asList(StringUtils.split(StringUtils.substringBetween("[1, 2, 3]", "[", "]"), ", "))
Notez que si les éléments de la liste ne sont pas des objets String alors l'action inverse est peut-être impossible de le faire parce que 'theList.toString()' 'appellera toString()' sur tous les éléments et qui pourraient ou ne pas être une action réversible (la représentation String peut ne pas contenir toutes les informations nécessaires pour reproduire l'objet d'origine). –