kzen.dev
  • Întrebări
  • Tag-uri
  • Utilizatori
Notificări
Recompense
Înregistrare
După înregistrare, veți primi notificări despre răspunsurile și comentariile la întrebările DVS.
Logare
Dacă aveţi deja un cont, autentificaţi-vă pentru a verifica notificările noi.
Aici vor fi recompensele pentru întrebările, răspunsurile și comentariile adăugate sau modificate.
Mai mult
Sursă
Editează
Nick Heiner
Nick Heiner
Question

Java: funcția de matrice, cum ar fi PHP's join()?

Vreau să se alăture o String[] cu un adeziv șir. Există o funcție pentru asta?

255 2009-10-04T02:27:27+00:00 22
 coobird
coobird
Întrebarea editată 4 octombrie 2009 в 2:52
Programare
arrays
java
php
join
Această întrebare are 1 răspuns în engleză, pentru a le citi, vă rugăm să vă logați.
Solution / Answer
 coobird
coobird
4 octombrie 2009 в 2:34
2009-10-04T02:34:05+00:00
Mai mult
Sursă
Editează
#9541420

Incepand de la Java8 este posibil să se utilizeze Șir de caractere.join().

String.join(", ", new String[]{"Hello", "World", "!"})

Generează:

Hello, World, !

În caz contrar, Apache Commons Lang are StringUtils clasă care are o join funcția care se va alătura tablouri împreună pentru a face un "String".

De exemplu:

StringUtils.join(new String[] {"Hello", "World", "!"}, ", ")

Generează următoarele String:

Hello, World, !
 cricket_007
cricket_007
Răspuns editat 26 august 2017 в 9:04
307
0
 Noah
Noah
20 februarie 2013 в 6:51
2013-02-20T18:51:17+00:00
Mai mult
Sursă
Editează
#9541432

Dacă ați fost în căutarea pentru ceea ce de a utiliza în android, este:

String android.text.TextUtils.join(CharSequence delimiter, Object[] tokens)

de exemplu:

String joined = TextUtils.join(";", MyStringArray);
71
0
Marek Gregor
Marek Gregor
18 martie 2014 в 9:12
2014-03-18T09:12:18+00:00
Mai mult
Sursă
Editează
#9541437

În Java 8, puteți utiliza

  1. Stream API :
String[] a = new String[] {"a", "b", "c"};
String result = Arrays.stream(a).collect(Collectors.joining(", "));
  1. nou Șir de caractere.alăturați-vă metodă: https://stackoverflow.com/a/21756398/466677

  2. java.util.StringJoiner clasa: http://docs.oracle.com/javase/8/docs/api/java/util/StringJoiner.html

 Community
Community
Răspuns editat 23 mai 2017 в 11:47
55
0
 Jay
Jay
4 octombrie 2009 в 3:57
2009-10-04T03:57:56+00:00
Mai mult
Sursă
Editează
#9541423

Ai putea scrie cu ușurință o astfel de funcție în aproximativ zece linii de cod:

String combine(String[] s, String glue)
{
  int k = s.length;
  if ( k == 0 )
  {
    return null;
  }
  StringBuilder out = new StringBuilder();
  out.append( s[0] );
  for ( int x=1; x < k; ++x )
  {
    out.append(glue).append(s[x]);
  }
  return out.toString();
}
Duncan Jones
Duncan Jones
Răspuns editat 12 martie 2015 в 3:29
52
0
 everlasto
everlasto
1 ianuarie 2012 в 11:30
2012-01-01T11:30:39+00:00
Mai mult
Sursă
Editează
#9541427

Un pic de mod în loc de a folosi subșir():

//join(String array,delimiter)
public static String join(String r[],String d)
{
        if (r.length == 0) return "";
        StringBuilder sb = new StringBuilder();
        int i;
        for(i=0;i<r.length-1;i++){
            sb.append(r[i]);
            sb.append(d);
        }
        sb.append(r[i]);
        return sb.toString();
}
 everlasto
everlasto
Răspuns editat 15 octombrie 2016 в 8:09
25
0
 icza
icza
4 august 2014 в 12:30
2014-08-04T12:30:29+00:00
Mai mult
Sursă
Editează
#9541439

Ca și cu multe întrebări în ultima vreme, Java 8 la salvare:


Java 8 a adăugat o nouă metodă statică a java.lang.String care face exact ceea ce vrei:

public static String join(CharSequence delimeter, CharSequence... elements);

Folosind-o:

String s = String.join(", ", new String[] {"Hello", "World", "!"});

Rezultate în:

"Hello, World, !"
18
0
 bertie
bertie
16 februarie 2012 в 5:11
2012-02-16T05:11:21+00:00
Mai mult
Sursă
Editează
#9541428

Google guava's library, de asemenea, a acest tip de capacitate. Puteți vedea String[] de exemplu, de asemenea, de la API.

Cum este deja descris în api, feriți-vă de imutabilitatea de constructor metode.

Se poate accepta o serie de obiecte așa că'll funcționează în cazul tău. În experiența mea anterioară, am încercat aderarea la o Stivă, care este un iterable și funcționează bine.

Proba la mine :

Deque<String> nameStack = new ArrayDeque<>();
nameStack.push("a coder");
nameStack.push("i am");
System.out.println("|" + Joiner.on(' ').skipNulls().join(nameStack) + "|");

afiseaza : |eu sunt un programator|

14
0
 devstopfix
devstopfix
5 iulie 2012 в 2:23
2012-07-05T14:23:32+00:00
Mai mult
Sursă
Editează
#9541429

Dacă utilizați Cadru de Primăvară apoi StringUtils clasă:

import static org.springframework.util.StringUtils.arrayToDelimitedString;

arrayToDelimitedString(new String[] {"A", "B", "C"}, "\n");
9
0
Rob  at TVSeries.com
Rob at TVSeries.com
12 decembrie 2011 в 5:48
2011-12-12T17:48:40+00:00
Mai mult
Sursă
Editează
#9541426

Având în vedere:

String[] a = new String[] { "Hello", "World", "!" };

Apoi, ca o alternativă la coobird's a răspunde, în cazul în care adezivul este ", ":

Arrays.asList(a).toString().replaceAll("^\\[|\\]$", "")

Sau să înlănțui cu un alt șir de caractere, cum ar fi " &amp; ".

Arrays.asList(a).toString().replaceAll(", ", " & ").replaceAll("^\\[|\\]$", "")

Cu toate acestea... aceasta funcționează NUMAI dacă știți că valorile din matrice sau lista NU conține șirul de caractere ", ".

9
0
Utilizator anonim
4 octombrie 2009 в 2:35
2009-10-04T02:35:27+00:00
Mai mult
Sursă
Editează
#9541421

Nu în miez, nr. O căutare pentru "java matrice se alăture șir lipici" vă va oferi câteva fragmente de cod cu privire la modul de a realiza acest lucru, deși.

de exemplu

public static String join(Collection s, String delimiter) {
    StringBuffer buffer = new StringBuffer();
    Iterator iter = s.iterator();
    while (iter.hasNext()) {
        buffer.append(iter.next());
        if (iter.hasNext()) {
            buffer.append(delimiter);
        }
    }
    return buffer.toString();
}
8
0
 quietmint
quietmint
25 ianuarie 2013 в 2:36
2013-01-25T14:36:25+00:00
Mai mult
Sursă
Editează
#9541430

Daca'am aterizat aici în căutarea pentru o rapidă matrice-să-șir de conversie, încerca Tablouri.toString().

Creează un Șir de reprezentare de Obiect[]trecut. Rezultatul este înconjurat de paranteze ("[]"), fiecare element este convertit la un Șir prinȘir de caractere.valueOf(Obiect) și separate prin ", ". Dacă matricea este nul", apoi " "nul" este returnat.

6
0
 sp00m
sp00m
26 august 2013 в 4:00
2013-08-26T16:00:44+00:00
Mai mult
Sursă
Editează
#9541435

Doar pentru "am'am cea mai scurtă" provocare, aici sunt la mine ;)

Iterativ:

public static String join(String s, Object... a) {
    StringBuilder o = new StringBuilder();
    for (Iterator<Object> i = Arrays.asList(a).iterator(); i.hasNext();)
        o.append(i.next()).append(i.hasNext() ? s : "");
    return o.toString();
}

Recursiv:

public static String join(String s, Object... a) {
    return a.length == 0 ? "" : a[0] + (a.length == 1 ? "" : s + join(s, Arrays.copyOfRange(a, 1, a.length)));
}
 sp00m
sp00m
Răspuns editat 26 august 2013 в 4:12
5
0
 JonMR
JonMR
4 octombrie 2009 в 2:36
2009-10-04T02:36:37+00:00
Mai mult
Sursă
Editează
#9541422

Nimic nu built-in de care să știu.

Apache Commons Lang are o clasa numita StringUtils care conține multe se alăture funcții.

 JonMR
JonMR
Răspuns editat 5 octombrie 2009 в 11:04
4
0
Richard Corfield
Richard Corfield
12 septembrie 2011 в 8:58
2011-09-12T20:58:04+00:00
Mai mult
Sursă
Editează
#9541425

Acest lucru este cum am face-o.

private String join(String[] input, String delimiter)
{
    StringBuilder sb = new StringBuilder();
    for(String value : input)
    {
        sb.append(value);
        sb.append(delimiter);
    }
    int length = sb.length();
    if(length > 0)
    {
        // Remove the extra delimiter
        sb.setLength(length - delimiter.length());
    }
    return sb.toString();
}
4
0
William Simpson
William Simpson
29 ianuarie 2013 в 9:32
2013-01-29T21:32:23+00:00
Mai mult
Sursă
Editează
#9541431

O alternativă similară

/**
 * @param delimiter 
 * @param inStr
 * @return String
 */
public static String join(String delimiter, String... inStr)
{
    StringBuilder sb = new StringBuilder();
    if (inStr.length > 0)
    {
        sb.append(inStr[0]);
        for (int i = 1; i < inStr.length; i++)
        {
            sb.append(delimiter);                   
            sb.append(inStr[i]);
        }
    }
    return sb.toString();
}
2
0
 Jackson
Jackson
1 mai 2014 в 11:08
2014-05-01T23:08:13+00:00
Mai mult
Sursă
Editează
#9541438

Mea de spin.

public static String join(Object[] objects, String delimiter) {
  if (objects.length == 0) {
    return "";
  }
  int capacityGuess = (objects.length * objects[0].toString().length())
      + ((objects.length - 1) * delimiter.length());
  StringBuilder ret = new StringBuilder(capacityGuess);
  ret.append(objects[0]);
  for (int i = 1; i < objects.length; i++) {
    ret.append(delimiter);
    ret.append(objects[i]);
  }
  return ret.toString();
}

public static String join(Object... objects) {
  return join(objects, "");
}
2
0
Ryoichiro Oka
Ryoichiro Oka
29 septembrie 2013 в 1:59
2013-09-29T01:59:25+00:00
Mai mult
Sursă
Editează
#9541436

Îți place meu de 3 linii de cale folosind doar clasa String's metode?

static String join(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());
}
1
0
Dmitry Zaytsev
Dmitry Zaytsev
24 august 2016 в 5:41
2016-08-24T17:41:22+00:00
Mai mult
Sursă
Editează
#9541441

În cazul în care te're folosind Funcționale Java library, și pentru un motiv oarecare poate't folosi Fluxuri de Java 8 (care ar putea fi cazul atunci când se utilizează Android + Retrolambda plugin), aici este o soluție funcțională pentru tine:

String joinWithSeparator(List<String> items, String separator) {
    return items
            .bind(id -> list(separator, id))
            .drop(1)
            .foldLeft(
                    (result, item) -> result + item,
                    ""
            );
}

Rețineți că l's nu mai eficientă abordare, dar aceasta nu funcționează bine pentru liste mici.

0
0
 ema
ema
16 martie 2016 в 9:33
2016-03-16T09:33:55+00:00
Mai mult
Sursă
Editează
#9541440

Pentru a obține "str1, str2" de la "str1", "str2", "" :

Stream.of("str1", "str2", "").filter(str -> !str.isEmpty()).collect(Collectors.joining(", ")); 

De asemenea, puteți adăuga suplimentar null-verifica

0
0
 spanky762
spanky762
21 martie 2013 в 10:07
2013-03-21T22:07:39+00:00
Mai mult
Sursă
Editează
#9541433

Eu fac acest fel, folosind un StringBuilder:

public static String join(String[] source, String delimiter) {
    if ((null == source) || (source.length < 1)) {
        return "";
    }

    StringBuilder stringbuilder = new StringBuilder();
    for (String s : source) {
        stringbuilder.append(s + delimiter);
    }
    return stringbuilder.toString();
} // join((String[], String)
-1
0
Comunități asemănătoare 1
PHP România, Moldova
PHP România, Moldova
121 utilizatori
Vorbim despre Laravel, Symfony, Yii, WP, OpenCart... @js_ro @python_ro @seo_ro @Romania_Bot Offtop: @holywars_ro https://github.com/js-ro/it-telegram
Deschide telegram
Adăugati o întrebare
Categorii
Toate
Tehnologii
Cultură
Viață / Artă
Stiință
Profesii
Afaceri
Utilizatori
Toate
Nou
Populare
1
工藤 芳則
Înregistrat 6 zile în urmă
2
Ирина Беляева
Înregistrat 1 săptămână în urmă
3
Darya Arsenyeva
Înregistrat 1 săptămână în urmă
4
anyta nuam-nuam (LapuSiK)
Înregistrat 1 săptămână în urmă
5
Shuhratjon Imomkulov
Înregistrat 1 săptămână în urmă
ID
JA
KO
RO
RU
© kzen.dev 2023
Sursă
stackoverflow.com
în cadrul licenței cc by-sa 3.0 cu atribuire