자바 : PHP의 join ()과 같은 배열 함수?


259

String[]접착제 끈 으로 조인하고 싶습니다 . 이것에 대한 기능이 있습니까?


7
Java 8에는이 기능이 기본적으로 포함되어 있습니다. 나는 독자가 @Marek Gregor의 답변으로 스크롤하는 것이 좋습니다 (그리고 찬성합니다.)
Stav

답변:


307

Java8 부터 사용할 수 있습니다 String.join().

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

생성합니다 :

Hello, World, !

그렇지 않으면 Apache Commons Lang 에는 배열을 결합하여를 만드는 함수 가있는 StringUtils클래스가 있습니다 .joinString

예를 들면 다음과 같습니다.

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

다음을 생성합니다 String.

Hello, World, !

7
이 답변을 검색하는 사람들의 이익을 위해 이것은 아마도 Perl 조인과 동일하다는 점에 유의해야합니다.
k-den

3
그것은 나에게 정의되어 있지 않다고 말합니다
Ninjaxor

@Ninjaxor 1. commons-lang * jar는 클래스 경로 2에 있어야합니다. import org.apache.commons.lang3.StringUtils;
peterh-Reinstate Monica

9
String.join()Java 8에 도입 된 새로운 방법에 대한 참조를 추가하기 위해이 답변을 편집하는 것이 좋습니다. 이 방법으로,이 승인 된 답변을 읽는 수많은 사람들이 그 지식을 활용할 수 있습니다. 현재,이 사실을 언급 한 가장 높은 표를 얻은 답변은 아래로 잃어
Duncan Jones

1
또는 요소 String.join()에만 효과 가 있다고 언급 할 가치가 있습니다. List<CharSequence>CharSequence[]
Enigo

71

안드로이드에서 무엇을 사용 해야하는지 찾고 있다면 다음과 같습니다.

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

예를 들면 다음과 같습니다.

String joined = TextUtils.join(";", MyStringArray);

2
Java 8은 Android에서만 조금 나오기 때문에 이것은 모든 Android 버전에 가장 적합한 대답입니다. 이 솔루션은 바보 같은 "하나의 액션을 수행하기 위해 거대한 lib를 포함하는"솔루션보다는 내장 된 Android 라이브러리를 사용합니다.
LukeStoneHm

2017 년 9 월, Android 용 Java 8은 아직 멀었습니다. 이 답변에 감사드립니다!
Aenadon


53

약 10 줄의 코드로 이러한 함수를 쉽게 작성할 수 있습니다.

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();
}

35
당신에 따르면 좋은 연습 ... 그런 것들에 대한 보편적 인 표준은 없습니다.
phoebus

24
그러나 중괄호를 포함하면 두 줄의 코드가 더 추가되어 11 줄에서 완료했다고 주장 할 수 없었습니다!
Jay

8
문제는 잠시 후 또는 다른 사람이 서둘러 중괄호를 추가하지 않고 if / for에 다른 줄을 추가하는 경우입니다. 또는 if (k == 0) 뒤에 null을 반환하면 일부 경우 컴파일되지만 올바르지 않습니다. 그런 다음 닫는 중괄호에 대해 하나의 추가 줄을 희생하는 것이 좋습니다 (개구는 if / for 줄에 동일하게 유지 될 수 있음).
milan

16
대부분의 언어가 그러한 기능을 핵심에 포함시키는 반면 Java 커뮤니티는 모든 사람들이 바퀴를 재발 명하도록 권장한다는 것이 정말 훌륭하다고 생각합니다.
John Strickler

33
11 줄? 바! 1로 할 수 있습니다! 소스 파일에서 개행 문자를 모두 제거하십시오.
Thomas Eding

25

substring ()을 사용하는 대신 약간의 모드 :

//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();
}

라이브러리를 추가 할 필요가 없기 때문에 투표했습니다.
givanse

10
7 행 : 연결하지 않고 빌더에 추가하는 대신 .append()각각에 대해 두 번 사용하는 것이 좋습니다 String.
Talha Ahmed Khan

18

최근 많은 질문과 마찬가지로 Java 8이 구출되었습니다.


Java 8 java.lang.String은 원하는 것을 정확하게 수행 하는 새로운 정적 메소드를 추가했습니다 .

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

그것을 사용 :

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

결과 :

"Hello, World, !"

14

구글 구아바의 라이브러리에는 이런 종류의 기능이 있습니다 . API에서도 String [] 예제를 볼 수 있습니다.

API에서 이미 설명했듯이 빌더 메소드의 불변성을주의하십시오.

객체 배열을 허용하므로 귀하의 경우에 효과가 있습니다. 이전 경험에서 반복 가능한 스택에 가입하려고 시도했지만 정상적으로 작동합니다.

나에게서 샘플 :

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

인쇄 : |i am a coder|


9

주어진:

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

그런 다음 접착제가 ","인 coobird의 답변에 대한 대안으로 :

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

또는 "& amp;"와 같은 다른 문자열과 연결합니다.

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

그러나 ... 이것은 배열 또는 목록의 값에 문자열 ","이 포함되어 있지 않다는 것을 알고있는 경우에만 작동합니다.


Arrays.asList(a).toString()근무 내가하고 싶었던 것
솔로몬 Ucko을

9

Spring Framework 를 사용하는 경우 StringUtils 클래스가 있습니다.

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

arrayToDelimitedString(new String[] {"A", "B", "C"}, "\n");

8

핵심이 아닙니다. "java array join string glue"를 검색하면이를 달성하는 방법에 대한 코드 스 니펫이 제공됩니다.

예 :

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();
}

2
성능 향상을 위해 StringBuffer (스레드 안전) 대신 StringBuilder (스레드 안전)를 사용하십시오. 인터페이스는 동일합니다.
Asaph

2
이것은 snippets.dzone.com/posts/show/91 에서 온 것으로 보입니다 . 주석은 훨씬 향상된 버전을 제안합니다. public static String join (Iterable <? extends Object> pColl, String separator) {Iterator <? Object> oIter를 확장합니다. if (pColl == null || (! (oIter = pColl.iterator ()) .hasNext ())) 반환 ""; StringBuilder oBuilder = 새로운 StringBuilder (String.valueOf (oIter.next ())); while (oIter.hasNext ()) oBuilder.append (구분자) .append (oIter.next ()); return oBuilder.toString (); }
Quantum7

6

배열에서 문자열로의 빠른 변환을 찾으러 온다면 Arrays.toString ()을 사용해보십시오 .

Object[]전달 된 문자열 표현을 작성합니다 . 결과는 괄호 ( "[]") 로 묶고 각 요소는을 통해 문자열로 변환 String.valueOf(Object)되고로 구분됩니다 ", ". 배열이 null이면 "null"반환됩니다.


매우 감사합니다! 문자열은 ","로 구분되며 전체에는 "[]"가 붙어 있습니다.
John Henckel

5

그냥에 대해 "나는 짧은 일을했습니다" 도전, 여기에 광산입니다)

반복적 인:

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();
}

재귀 :

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)));
}

2
재귀 버전은 우아합니다. 확실히 사용할 것입니다.
Pete

재귀 버전은 우아하지만 큰 배열 ( " copyOfRange()") 에는 비효율적입니다 .
오우거 시편


4

이것이 내가하는 방법입니다.

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();
}

2

비슷한 대안

/**
 * @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

내 스핀.

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, "");
}

1

String 클래스의 메소드 만 사용하는 3 줄 방법을 좋아합니까?

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
효율적이지 않습니다. StringBuilder효율성이 필요한 경우 사용 : P
Ryoichiro Oka

0

"str1", "str2", ""에서 "str1, str2"를 가져 오려면 다음을 수행하십시오.

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

또한 null 검사를 추가 할 수 있습니다


0

Functional Java 라이브러리를 사용 중이고 어떤 이유로 Java 8의 스트림 (Android + Retrolambda 플러그인을 사용하는 경우)을 사용할 수없는 경우 다음과 같은 기능적 솔루션이 있습니다.

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

가장 효율적인 방법은 아니지만 소규모 목록에는 적합합니다.


-1

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
s + delimiter(더하기 연산자와의 문자열 연결)는를 사용하는 전체 목적을 무효화합니다 StringBuilder.
quietmint

또한이 접근 방식은 {: foo ","bar "}와 구분 기호가": "인 배열이"foo : bar : "로
바뀌는 것을 의미

-2

내가 가장 많이 사용하는 간단한 속기 기술이 있습니다.

String op = new String;
for (int i : is) 
{
    op += candidatesArr[i-1]+",";
}
op = op.substring(0, op.length()-1);

길이가 1 인 구분자와 만 작동하며 길이가 다른 구분자를 원할 경우 '매직 숫자'(매우 로컬)가 필요합니다.
maiwald

추가하는 동안 여러 문자를 추가 할 수 있습니다
Gaurav Adurkar

단순히 수행하는 것보다 : op = op.substring (0, op.length ()- ",". length ()); 큰 문제는 무엇입니까?
Dennis

-3

java.util.Arrays에는 'asList'메소드가 있습니다. java.util.List / ArrayList API와 함께 필요한 모든 것을 제공합니다.;

private static String[] join(String[] array1, String[] array2) {

    List<String> list = new ArrayList<String>(Arrays.asList(array1));
    list.addAll(Arrays.asList(array2));
    return list.toArray(new String[0]);
}

7
문제는 두 문자열 배열을 함께 결합하는 방법이 아니라 문자열 배열을 구분 기호로 결합하는 방법입니다.
toolbear
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.