9
votes

Une solution plus élégante pour créer une matrice de la liste des propriétés de la virgule SEP?

Dans mon fichier de propriétés, j'ai une propriété, qui contient une liste de valeurs séparées par des virgules

dans mon code, je voudrais charger cette propriété dans, diviser à partir des virgules et ajouter chaque valeur dans un tableau. Je veux aussi m'assurer que je n'ai pas de valeurs dans le tableau due à WhitSpace, etc. p>

Exemple de propriété: p>

String test = classProperties.getProperty("prop_allowed_extensions", "txt, jpeg");
String[] splitString = StringUtils.split(test, ',');
String[] newString = new String[splitString.length];             
for (int i = 0; i < splitString.length; i++)
{
   newString[i] = StringUtils.trim(splitString[i]);                
}


1 commentaires

Apparemment, personne ne lisait la question. Lisez à nouveau la dernière phrase: il veut simplement le texte de l'extension de fichier (les périodes doivent être dépouillées si elles sont présentes). Presque aucune des solutions ici faites cela.


7 Réponses :


1
votes

Après votre motif, vous pouvez le faire comme ceci:

String test = classProperties.getProperty("prop_allowed_extensions", "txt, jpeg");
List<String> extensions = new ArrayList<String>();         
for (String part:test.split(",")) {
   extensions.add(part.trim());               
}


5 commentaires

Essayer de le garder comme une chaîne [] afin que je puisse l'utiliser dans fileutils.listallfiles COMMON.APACHE.ORG/IO/API-1.4/ORG/APACHE/COMMONS/OIO/ ...


Vous pouvez faire des extensions.toarray (nouvelle chaîne [extensions.size ()]) pour obtenir une chaîne [] à passer à FileUtils.Listallfiles.


Euh, alors quel est le point d'aller à la liste? Des gits et des shiggles?


La liste est là pour que vous puissiez avoir un endroit pour mettre les extensions sans avoir à vous soucier de l'affectation de suffisamment d'espace à l'avance ou de la gérer comme vous le suivez.


Oui, mais string.split () prend en charge cela déjà. Je ne vois pas non plus le point d'utiliser une liste ici.



-1
votes
String test = classProperties.getProperty("prop_allowed_extensions", "txt, jpeg");
String[] splitString = StringUtils.split(test, ',');
for(String s : splitString) {
    s = StringUtils.trim(s);
}
would be slightly more elegant, but Java does not support LINQ like .net where you would be able to avoid the explicit loop altogether.

3 commentaires

-1 Cela ne fonctionne pas. Vous redistribuez des variables locales, sans changement de valeurs de matrice


Vous avez raison, alors j'aurais même besoin de la boucle avec un indice entier.


Oui, la boucle améliorée ne permet que la lecture, ne pas changer ou enlever.



1
votes
String[] allowedFormats = classProperties
                           .getProperty("prop_allowed_extensions", "txt, jpeg")
                           .replaceAll("[ \\.]","")
                           .split(",");
With Java 1.5 or superior, in Array format.

4 commentaires

Ne se débarrasserait pas de l'espace avant "JPEG".


ne se débarrasserait pas non plus des périodes, non plus


@Seanizer Ce serait, en fait, c'est ce que Split ("," est pour.


Nope, je ne parle pas des virgules, mais les périodes. Lisez la question. Exemple de données est ".jpeg, tiff, .txt" et il dit qu'il veut perdre toutes les non-lettres



4
votes

Vous pouvez le faire en deux étapes:

String[] allowedExtensions = str.replaceAll("[^\\w,_]", "").split(",")


2 commentaires

Probablement inutilement restrictif. Les extensions de fichier ont souvent des traits de soulignement, etc.


Jamais entendu parler des traits de soulignement dans les extensions de fichiers, mais je leur ajouterai de toute façon.



4
votes

J'aurais personnellement la réduisante à ce qui suit (gardant à l'esprit que string.split () prend une expression régulière), mais je ne sais pas si vous "D Considérez-le plus élégant: xxx

EDIT : Vous pouvez supprimer également le premier point sur chaque extension, s'il est présent (ceci ou l'un de plusieurs autres façons): xxx


7 commentaires

Pas complet, car il peut y avoir des périodes qui doivent être dépouillées. Le motif doit être ceci: "\\ s *, \\ s * \\.?", Mais une période initiale le brise de toute façon.


est la garniture () exécutée avant Split ()? Si tel est le cas, alors comment allumera-t-il l'espace à l'intérieur de la chaîne, c'est-à-dire non sur l'une des deux extrémités? "Propriétés, propriétés"


@James: Vous vous séparez non seulement une virgule, mais plutôt une virgule avant / des espaces de suivi. Étant donné que le délimiteur est ignoré dans la matrice résultante, le blancheur sera exclu. La garniture se débarrasse des cas de frontière.


@Seanizer: Je pense que l'OP n'était pas clair. Nous avons été amenés à croire que son exemple dans le poste était une façon fonctionnelle de faire ce qu'il voulait faire, ce qui laisse dans le point. Sa description semble impliquer qu'il ne veut pas le point. Cette réponse est fonctionnellement équivalente à son code.


@James - La droite de Mark, l'appel de la trim permet à la fin et au début de la chaîne de propriétés. À l'origine, j'avais essayé de se scinder sur "^ \\ s * | \\ s *, \\ s premier élément vide dans le tableau dans ce cas. Cela garantit que vous ne le faites pas.


@Mark Yup, j'ai l'habitude de lire des questions et non seulement du code existant.


Il est en fait inutile d'éliminer les périodes dans le sens où FileUtils.ListFiles () Il suffit de les ajoute, mais la méthode ne acceptera pas correctement les extensions avec des points de premier plan, ce faisant, il est donc nécessaire de répondre à la question de l'OP. Je pense que le "texte de l'extension de fichier" est un peu vague (même avec des "non-lettres"), étant donné l'exemple de code, mais oh bien.



0
votes

C'est beaucoup plus simple: xxx

(nécessite Java 5)


0 commentaires

7
votes

APACHE JAKARTA Commons Configuration Poignée Propriétés Fichier de manière propre, vous permettant de spécifier des listes dans Différents formats: xxx

ou xxx

et obtenir la liste comme ceci: xxx < p> Voir le Comment


2 commentaires

Et si vous ne voulez pas l'utiliser, vous risquez peut-être de regarder comment ils l'ont fait dans le code :)


J'ai voté pour cela et pour la réponse de Tim. Si cela ne vous dérange pas d'ajouter une autre bibliothèque à votre dépendance, c'est mon approche préférée. En outre, s'il y a une bibliothèque qui peut déjà le faire, pourquoi le faire vous-même?