2013-04-04 15 views
95

Mam Set<String> result & chciałbym przekonwertować go na ciąg oddzielony przecinkami. Moje podejście będzie takie, jak pokazano poniżej, ale także szukam innych opinii.Najlepszy sposób konwertowania list na ciąg rozdzielany przecinkami w java

List<String> slist = new ArrayList<String> (result); 
StringBuilder rString = new StringBuilder(); 

Separator sep = new Separator(", "); 
//String sep = ", "; 
for (String each : slist) { 
    rString.append(sep).append(each); 
} 

return rString; 
+0

Co to jest "separator"? – kay

+0

Jeśli twoja aplikacja zawiera Spring, to ma ona metodę użyteczną [collectionToCommaDelimitedString] (http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/util/StringUtils.html#collectionToCommaDelimitedString% 28java.util.Collection% 29). Nie ściągałbym biblioteki tylko dlatego, ale jeśli używasz jej już ... –

+7

'List.toString' robi to już, po prostu usuń ostatni i pierwszy znak. –

Odpowiedz

287

Z biblioteki Apache Commons:

import org.apache.commons.lang3.StringUtils 

Zastosowanie:

StringUtils.join(slist, ','); 

Innym podobne pytanie i odpowiedzieć here

+19

StringUtils z Apache Commons Lang (http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#join(java.util.Iterator, char)) – Sigrist

+40

Android, możesz użyć TextUtils.join(). –

+1

Java nie obsługuje pojedynczych cudzysłowów –

3

Separator używasz jest elementem interfejsu użytkownika. Lepiej byłoby użyć prostego modelu String sep = ", ".

6

Najpierw można policzyć całkowitą długość ciągu i przekazać go do konstruktora StringBuilder. I nie musisz najpierw konwertować zestawu.

Set<String> abc = new HashSet<String>(); 
abc.add("A"); 
abc.add("B"); 
abc.add("C"); 

String separator = ", "; 
int total = abc.size() * separator.length(); 
for (String s : abc) { 
    total += s.length(); 
} 

StringBuilder sb = new StringBuilder(total); 
for (String s : abc) { 
    sb.append(separator).append(s); 
} 

String result = sb.substring(separator.length()); // remove leading separator 
+2

Należy pamiętać, że jeśli zestaw jest pusty, StringBuilder.substring wygeneruje wyjątek. – Nier

+1

Musisz dwukrotnie przejść przez String. Zatem jest to efektywnie algorytm N^2. Naprawdę długie struny będą wykonywać strasznie, aw zależności od twojej aplikacji otworzą wektor ataku DoS. – SoftwareSavant

+0

@Kay robię bardzo. Algorytm, którego czas działania zwiększa się logarytmicznie w zależności od liczby obiektów, na których działa. Dlaczego jakoś przeliczyłem rachunki? Czy źle odczytałem twój kod? w nim przechodzi się przez ten sam ciąg 2 razy, pierwszy, aby zliczyć sumę sekundową do uzupełnienia ciągu znaków i separatora. Wyobraź sobie zamiast zestawu trzech, że masz zestaw 3 milionów? Czy możesz sobie wyobrazić, jak długo trwa to rozwiązanie? – SoftwareSavant

Powiązane problemy