[java] StringBuilder의 마지막 문자를 제거 하시겠습니까?

컬렉션을 반복하고 구분 기호로 구분 된 각 데이터의 문자열을 만들어야하는 경우 항상 끝에 추가 구분 기호가 있어야합니다. 예 :

for (String serverId : serverIds) {
  sb.append(serverId);
   sb.append(",");
}

같은 것을 제공합니다 : serverId_1, serverId_2, serverId_3,

StringBuilder에서 마지막 문자를 삭제하고 싶습니다 (이 루프 후에 여전히 문자가 필요하기 때문에 변환하지 않고).



답변

다른 사람들은이 deleteCharAt방법 을 지적 했지만 여기에 다른 대안이 있습니다.

String prefix = "";
for (String serverId : serverIds) {
  sb.append(prefix);
  prefix = ",";
  sb.append(serverId);
}

또는 구아바Joiner클래스를 사용하십시오. 🙂

Java 8 StringJoiner부터는 표준 JRE의 일부입니다.


답변

또 다른 간단한 해결책은 다음과 같습니다.

sb.setLength(sb.length() - 1);

더 복잡한 해결책 :

위의 해결책은 sb.length() > 0… “마지막으로 제거 할 문자”가 있다고 가정합니다 . 해당 가정을 할 수 없거나 가정이 잘못된 경우 발생할 수있는 예외를 처리 할 수없는 경우 먼저 StringBuilder의 길이를 확인하십시오. 예 :

// Readable version
if (sb.length() > 0) {
   sb.setLength(sb.length() - 1);
}

또는

// Concise but harder-to-read version of the above.
sb.setLength(Math.max(sb.length() - 1, 0));


답변

if(sb.length() > 0){
    sb.deleteCharAt(sb.length() - 1);
}


답변

Java 8부터 String 클래스에는 정적 메소드가 join있습니다. 첫 번째 인수는 각 문자열 쌍 사이에서 원하는 문자열이고 두 번째 인수는 Iterable<CharSequence>(두 인터페이스 모두 List<String>작동 하므로 작동하는 것과 같습니다 . 따라서 다음과 같이 할 수 있습니다.

String.join(",", serverIds);

또한 Java 8에서는 StringJoiner전체 요소 목록을 작성하기 전에 문자열 구성을 시작하려는 시나리오에 새 클래스를 사용할 수 있습니다 .


답변

마지막 문자 발생 위치를 얻으십시오.

for(String serverId : serverIds) {
 sb.append(serverId);
 sb.append(",");
}
sb.deleteCharAt(sb.lastIndexOf(","));

때문에 lastIndexOf역 검색을 수행하고, 당신이 첫 번째 시도에서 찾을 수 있음을 알 수, 성능은 여기에 문제가되지 않을 것입니다.

편집하다

내 대답에 계속 관심을 기울이기 때문에 (감사합니다 ?), 그에 관한 가치가 있습니다.

자바 8 이후를 그냥 더 읽기 쉽고 사용이 명시 될 것 StringJoiner을 . 간단한 구분 기호에 대한 한 가지 방법과 접두사 및 접미사에 대한 과부하가 있습니다.

여기에서 가져온 예 :

간단한 구분 기호를 사용하는 예 :

    StringJoiner mystring = new StringJoiner("-");

    // Joining multiple strings by using add() method  
    mystring.add("Logan");
    mystring.add("Magneto");
    mystring.add("Rogue");
    mystring.add("Storm");

    System.out.println(mystring);

산출:

로건 마그네토 도적 폭풍

접미사와 접두사가있는 예 :

    StringJoiner mystring = new StringJoiner(",", "(", ")");

    // Joining multiple strings by using add() method  
    mystring.add("Negan");
    mystring.add("Rick");
    mystring.add("Maggie");
    mystring.add("Daryl");

    System.out.println(mystring);

산출

(네간, 릭, 매기, 대릴)


답변

이 경우

sb.setLength(sb.length() - 1);

'\0'마지막 문자를 삭제 하는 대신 마지막 값을 지정하기 때문에 바람직합니다.System.arraycopy


답변

으로 Java-8당신의 정적 인 방법을 사용할 수 있습니다 String클래스,

String#join(CharSequence delimiter,Iterable<? extends CharSequence> elements).


public class Test {

    public static void main(String[] args) {

        List<String> names = new ArrayList<>();
        names.add("James");
        names.add("Harry");
        names.add("Roy");
        System.out.println(String.join(",", names));
    }
}

산출

James,Harry,Roy