컬렉션을 반복하고 구분 기호로 구분 된 각 데이터의 문자열을 만들어야하는 경우 항상 끝에 추가 구분 기호가 있어야합니다. 예 :
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);
}
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