Z korzyścią dla osób szukających tej odpowiedzi należy prawdopodobnie zauważyć, że jest to również odpowiednik połączenia Perla.
k-den
3
mówi, że jest dla mnie niezdefiniowany
Ninjaxor,
@Ninjaxor 1. jar commons-lang * musi znajdować się w ścieżce klasy 2. import org.apache.commons.lang3.StringUtils;
peterh - Przywróć Monikę
9
Polecam edycję tej odpowiedzi, aby dołączyć odniesienie do nowej String.join()metody wprowadzonej w Javie 8. W ten sposób ogromna liczba osób czytających tę zaakceptowaną odpowiedź skorzysta z tej wiedzy. Obecnie najwyżej głosowana odpowiedź na ten fakt jest raczej zagubiona poniżej ...
Duncan Jones
1
Warto wspomnieć, że String.join()będzie działać tylko na List<CharSequence>lub CharSequence[]elementy.
Enigo,
71
Jeśli szukasz tego, czego użyć w Androidzie, jest to:
Jest to zdecydowanie najlepsza odpowiedź dla wszystkich wersji Androida, ponieważ Java 8 pojawia się na Androida dopiero za chwilę. To rozwiązanie wykorzystuje wbudowane biblioteki systemu Android, a nie te głupie rozwiązania „obejmują ogromną bibliotekę do wykonania jednej akcji”.
LukeStoneHm
Jest wrzesień 2017, Java 8 dla Androida jest wciąż daleko. Dzięki za tę odpowiedź!
Aenadon
57
W Javie 8 możesz używać
1) Stream API:
String[] a =newString[]{"a","b","c"};String result =Arrays.stream(a).collect(Collectors.joining(", "));
Możesz łatwo napisać taką funkcję w około dziesięciu wierszach kodu:
String combine(String[] s,String glue){int k = s.length;if( k ==0){returnnull;}StringBuilderout=newStringBuilder();out.append( s[0]);for(int x=1; x < k;++x ){out.append(glue).append(s[x]);}returnout.toString();}
Dobra praktyka według ciebie ... nie ma uniwersalnego standardu dla takich rzeczy.
phoebus
24
Gdybym jednak dodał nawiasy klamrowe, dodałbym jeszcze dwa wiersze kodu i nie mogłem twierdzić, że zrobiłem to w 11 wierszach!
Jay
8
problem polega na tym, że po chwili lub w pośpiechu dodajesz kolejną linię, jeśli / bez dodawania nawiasów klamrowych; lub usuń return null po if (k == 0), który w niektórych przypadkach skompiluje się, ale będzie niepoprawny. Następnie lepiej poświęcić jedną dodatkową linię dla tej klamry zamykającej (otwarcie może pozostać w tej samej linii jeśli / dla).
Mediolan
16
Myślę, że to niesamowite, że chociaż większość języków ma taką funkcjonalność w swoim rdzeniu, społeczność Java zachęca wszystkich do ponownego odkrycia koła.
John Strickler,
33
11 linii? Bah! Mogę to zrobić w 1! Po prostu usuń wszystkie znaki nowego wiersza z pliku źródłowego.
Biblioteka Google guava ma również tego rodzaju możliwości . Możesz zobaczyć przykład String [] również z API.
Jak już opisano w interfejsie API, strzeż się niezmienności metod konstruktora.
Może przyjmować tablicę obiektów, więc będzie działać w twoim przypadku. W poprzednim doświadczeniu próbowałem dołączyć do stosu, który jest iterowalny i działa dobrze.
Użyj StringBuilder (nie bezpieczny dla wątków) zamiast StringBuffer (bezpieczny dla wątków) dla lepszej wydajności. Interfejs jest taki sam.
Asaph
2
Wygląda na to, że pochodzi z snippets.dzone.com/posts/show/91 . Komentarze sugerują znacznie ulepszoną wersję: publiczne statyczne łączenie ciągów (Iterable <? Extends Object> pColl, separator ciągów) {Iterator <? rozszerza Obiekt> oIter; if (pColl == null || (! (oIter = pColl.iterator ()) .hasNext ())) return ""; StringBuilder oBuilder = new StringBuilder (String.valueOf (oIter.next ())); while (oIter.hasNext ()) oBuilder.append (separator) .append (oIter.next ()); return oBuilder.toString (); }
Quantum7,
6
Jeśli wylądowałeś tutaj, szukając szybkiej konwersji tablic na ciąg, wypróbuj Arrays.toString () .
Tworzy ciąg reprezentujący Object[]przekazane. Wynik jest otoczony nawiasami kwadratowymi ( "[]"), każdy element jest konwertowany na ciąg znaków przez String.valueOf(Object)i oddzielany przez ", ". Jeśli tablica jest
null, to "null"jest zwracana.
DZIĘKUJĘ BARDZO! Ciągi znaków są oddzielone „,”, a cała rzecz ma wokół siebie „[]”, co jest dla mnie w porządku.
John Henckel
5
Tylko dla wyzwania „Mam najkrótszy” , oto kopalnie;)
Wielokrotny:
publicstaticString join(String s,Object... a){StringBuilder o =newStringBuilder();for(Iterator<Object> i =Arrays.asList(a).iterator(); i.hasNext();)
o.append(i.next()).append(i.hasNext()? s :"");return o.toString();}
Czy podoba Ci się mój sposób 3-liniowy przy użyciu tylko metod klasy String?
staticStringjoin(String glue,String[] array){String line ="";for(String s : array) line += s + glue;return(array.length ==0)? line : line.substring(0, line.length()- glue.length());}
Jeśli korzystasz z biblioteki Functional Java i z jakiegoś powodu nie możesz używać strumieni z Java 8 (co może mieć miejsce w przypadku korzystania z wtyczki Android + Retrolambda), oto funkcjonalne rozwiązanie dla Ciebie:
Odpowiedzi:
Począwszy od Java8 można używać
String.join()
.Generuje:
W przeciwnym razie Apache Commons Lang ma
StringUtils
klasę, która majoin
funkcję, która połączy tablice razem, aby utworzyćString
.Na przykład:
Generuje następujące
String
:źródło
String.join()
metody wprowadzonej w Javie 8. W ten sposób ogromna liczba osób czytających tę zaakceptowaną odpowiedź skorzysta z tej wiedzy. Obecnie najwyżej głosowana odpowiedź na ten fakt jest raczej zagubiona poniżej ...String.join()
będzie działać tylko naList<CharSequence>
lubCharSequence[]
elementy.Jeśli szukasz tego, czego użyć w Androidzie, jest to:
na przykład:
źródło
W Javie 8 możesz używać
1) Stream API:
2) nowa metoda String.join: https://stackoverflow.com/a/21756398/466677
3) Klasa java.util.StringJoiner: http://docs.oracle.com/javase/8/docs/api/java/util/StringJoiner.html
źródło
Możesz łatwo napisać taką funkcję w około dziesięciu wierszach kodu:
źródło
Mały mod zamiast używać substring ():
źródło
.append()
dwa razy dla każdegoString
zamiast połączyć je, a następnie dołączyć do konstruktora.Jak w przypadku wielu pytań ostatnio, Java 8 na ratunek:
Java 8 dodała nową metodę statyczną,
java.lang.String
która robi dokładnie to, co chcesz:Użyj tego:
Prowadzi do:
źródło
Biblioteka Google guava ma również tego rodzaju możliwości . Możesz zobaczyć przykład String [] również z API.
Jak już opisano w interfejsie API, strzeż się niezmienności metod konstruktora.
Może przyjmować tablicę obiektów, więc będzie działać w twoim przypadku. W poprzednim doświadczeniu próbowałem dołączyć do stosu, który jest iterowalny i działa dobrze.
Próbka ode mnie:
drukuje:
|i am a coder|
źródło
Dany:
Następnie jako alternatywa dla odpowiedzi Coobirda, gdzie klejem jest „,”:
Lub połączyć z innym ciągiem, takim jak „& amp;”.
Jednak ... ten działa TYLKO, jeśli wiesz, że wartości w tablicy lub liście NIE zawierają ciągu znaków „,”.
źródło
Arrays.asList(a).toString()
pracował dla tego, co chciałem zrobićJeśli używasz Spring Framework , masz klasę StringUtils :
źródło
Nie w rdzeniu, nie. Poszukiwanie „kleju do łączenia łańcuchów java” da ci kilka fragmentów kodu, jak to osiągnąć.
na przykład
źródło
Jeśli wylądowałeś tutaj, szukając szybkiej konwersji tablic na ciąg, wypróbuj Arrays.toString () .
źródło
Tylko dla wyzwania „Mam najkrótszy” , oto kopalnie;)
Wielokrotny:
Rekurencyjne:
źródło
copyOfRange()
”).Nic wbudowanego, o czym wiem.
Apache Commons Lang ma klasę o nazwie,
StringUtils
która zawiera wiele funkcji łączenia.źródło
Tak to robię.
źródło
Podobna alternatywa
źródło
Mój obrót.
źródło
Czy podoba Ci się mój sposób 3-liniowy przy użyciu tylko metod klasy String?
źródło
StringBuilder
jeśli potrzebujesz wydajności: PAby uzyskać „str1, str2” z „str1”, „str2”, „”:
Możesz także dodać dodatkową kontrolę zerową
źródło
Jeśli korzystasz z biblioteki Functional Java i z jakiegoś powodu nie możesz używać strumieni z Java 8 (co może mieć miejsce w przypadku korzystania z wtyczki Android + Retrolambda), oto funkcjonalne rozwiązanie dla Ciebie:
Pamiętaj, że nie jest to najbardziej wydajne podejście, ale działa dobrze w przypadku małych list.
źródło
Robię to w ten sposób za pomocą StringBuilder:
źródło
s + delimiter
(konkatenacja ciągów z operatorem plusa) pokonuje cały cel używaniaStringBuilder
.źródło
java.util.Arrays ma metodę „asList”. W połączeniu z interfejsem API java.util.List / ArrayList zapewnia to wszystko, czego potrzebujesz :;
źródło