java String.split()의 효과를 되돌리는 메서드?
문자열 배열을 구분 문자열로 조합하는 방법을 찾고 있습니다.split()의 반대입니다.
직접 작성하기 전에 포럼에 묻고 싶다(JDK에 모든 것이 있기 때문에)
JDK에는 제가 아는 방법이 없습니다.Apache Commons Lang은 다양한 과부하가 있습니다.join()
원하는 것을 할 수 있는 방법을 찾을 수 있습니다.
적어도 2009년부터 오픈 기능의 요구가 있었습니다.요점은 JDK 8의 java.util 기능의 일부라는 것입니다.String Joiner 클래스http://download.java.net/lambda/b81/docs/api/java/util/StringJoiner.html
관심 있는 경우 Oracle에 관한 문제를 소개합니다.http://bugs.sun.com/view_bug.do?bug_id=5015163
다음은 String 배열의 새로운 JDK 8 String Joiner의 예입니다.
String[] a = new String[]{"first","second","third"};
StringJoiner sj = new StringJoiner(",");
for(String s:a) sj.add(s);
System.out.println(sj); //first,second,third
String의 유틸리티 메서드는 이를 더욱 단순하게 합니다.
String s = String.join(",", stringArray);
은, 「 」로부터 슬쩍 꺼낼 수 .Arrays
유틸리티 패키지
import java.util.Arrays;
...
String delim = ":",
csv_record = "Field0:Field1:Field2",
fields[] = csv_record.split(delim);
String rebuilt_record = Arrays.toString(fields)
.replace(", ", delim)
.replaceAll("[\\[\\]]", "");
여기 다음과 같은 예가 있습니다.
/*
7) Join Strings using separator >>>AB$#$CD$#$EF
*/
import org.apache.commons.lang.StringUtils;
public class StringUtilsTrial {
public static void main(String[] args) {
// Join all Strings in the Array into a Single String, separated by $#$
System.out.println("7) Join Strings using separator >>>"
+ StringUtils.join(new String[] { "AB", "CD", "EF" }, "$#$"));
}
}
Google은 Google 컬렉션 라이브러리에서 다음과 같은 joiner 클래스도 제공합니다.
컬렉션과 함께 사용할 수 있는 자신의 스니펫을 롤하는 경우 DZone 스니펫에는 몇 가지 예가 있습니다.예를 들어 다음과 같습니다.
public static String join(AbstractCollection<String> s, String delimiter) {
if (s == null || s.isEmpty()) return "";
Iterator<String> iter = s.iterator();
StringBuilder builder = new StringBuilder(iter.next());
while( iter.hasNext() )
{
builder.append(delimiter).append(iter.next());
}
return builder.toString();
}
int[]가 있는 ,Arrays.toString()
가장 쉬운 방법입니다.
위의 모든 답변에 근거합니다.
public static String join(Iterable<? extends Object> elements, CharSequence separator)
{
StringBuilder builder = new StringBuilder();
if (elements != null)
{
Iterator<? extends Object> iter = elements.iterator();
if(iter.hasNext())
{
builder.append( String.valueOf( iter.next() ) );
while(iter.hasNext())
{
builder
.append( separator )
.append( String.valueOf( iter.next() ) );
}
}
}
return builder.toString();
}
Android의 경우: Android.text.Text Utils에는 다음과 같은 메서드가 있습니다.
public static String join (CharSequence delimiter, Iterable tokens)
public static String join (CharSequence delimiter, Object[] tokens)
구분 기호로 결합된 토큰을 포함하는 문자열을 반환합니다.
토큰 - 결합할 배열 객체.오브젝트로부터 object.toString()을 호출하여 스트링을 형성합니다.
JDK8은 Streams와 Lambdas를 매우 좋아하기 때문에 다음과 같이 제안합니다.
public static String join( String delimiter, String[] array )
{
return Arrays.asList( array ).stream().collect( Collectors.joining( delimiter ) );
}
String #split은 정규 표현을 받아들이기 때문에 전체적으로 리버스 할 수 없다는 점을 덧붙이고 싶습니다.
"hello__world".split("_+");
율["hello", "world"]
.
"hello_world".split("_+");
율["hello", "world"]
다른 시작점에서 동일한 결과를 얻을 수 있습니다.분할은 일대일 연산이 아니므로 되돌릴 수 없습니다.
따라서 파라미터가 regex가 아닌 고정 문자열이라고 가정할 경우 게시된 많은 답변 중 하나를 사용하여 이 작업을 수행할 수 있습니다.
이것도 나쁘지 않아요.
public static String join(String delimitor,String ... subkeys) {
String result = null;
if(null!=subkeys && subkeys.length>0) {
StringBuffer joinBuffer = new StringBuffer(subkeys[0]);
for(int idx=1;idx<subkeys.length;idx++) {
joinBuffer.append(delimitor).append(subkeys[idx]);
}
result = joinBuffer.toString();
}
return result;
}
이렇게 썼어요.
public static String join(Collection<String> col, String delim) {
StringBuilder sb = new StringBuilder();
Iterator<String> iter = col.iterator();
if (iter.hasNext())
sb.append(iter.next());
while (iter.hasNext()) {
sb.append(delim);
sb.append(iter.next());
}
return sb.toString();
}
Collection
는 JSP에서 지원되지 않기 때문에 TLD에 대해 다음과 같이 기술했습니다.
public static String join(List<?> list, String delim) {
int len = list.size();
if (len == 0)
return "";
StringBuilder sb = new StringBuilder(list.get(0).toString());
for (int i = 1; i < len; i++) {
sb.append(delim);
sb.append(list.get(i).toString());
}
return sb.toString();
}
을 에 넣다.tld
파일:
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee"
<function>
<name>join</name>
<function-class>com.core.util.ReportUtil</function-class>
<function-signature>java.lang.String join(java.util.List, java.lang.String)</function-signature>
</function>
</taglib>
JSP 파일에서 다음과 같이 사용합니다.
<%@taglib prefix="funnyFmt" uri="tag:com.core.util,2013:funnyFmt"%>
${funnyFmt:join(books, ", ")}
아래 코드는 기본적인 개념을 제공합니다.하지만 이것은 최선의 해결책은 아닙니다.
public static String splitJoin(String sourceStr, String delim,boolean trim,boolean ignoreEmpty){
return join(Arrays.asList(sourceStr.split(delim)), delim, ignoreEmpty);
}
public static String join(List<?> list, String delim, boolean ignoreEmpty) {
int len = list.size();
if (len == 0)
return "";
StringBuilder sb = new StringBuilder(list.get(0).toString());
for (int i = 1; i < len; i++) {
if (ignoreEmpty && !StringUtils.isBlank(list.get(i).toString())) {
sb.append(delim);
sb.append(list.get(i).toString().trim());
}
}
return sb.toString();
}
jdk8을 사용하는 경우 @Nathaniel Johnson의 답변을 참조하십시오.
나는 여기에 있는 많은 대답들이 복잡하거나 쉽게 읽히지 않는다고 생각한다.지점 예측이 매우 효율적이기 때문에 if 문을 사용하지 않는 이유는 무엇입니까?
public static String join(List<String> fooList){
if (fooList.isEmpty()) return "";
StringBuilder sb = null;
for (String element : fooList) {
if (sb == null) {
sb = new StringBuilder();
} else {
sb.append(", ");
}
sb.append(element);
}
return sb.toString();
}
여기서 언급해야 할 것은 Apache는 다음과 같은 if 문이 포함된 단순한 for 루프를 사용하고(첫 번째 요소를 알기 위한 인덱스로 어레이를 사용), openjdk 8은 동일한 작업을 수행하지만 단순한 루프가 아닌 별도의 메서드 호출을 수행한다는 것입니다.
난 이게 더 좋아.
public String join(Collection<String> strCollection, String delimiter) {
String joined = "";
int noOfItems = 0;
for (String item : strCollection) {
joined += item;
if (++noOfItems < strCollection.size())
joined += delimiter;
}
return joined;
}
지금까지 발견된 솔루션 중 가장 깔끔한 솔루션입니다.(String Builder 대신 raw String 개체를 사용할 필요는 없습니다.최신 Java 컴파일러는 String Builder를 사용하지만 이 코드는 더 읽기 쉽습니다.)
언급URL : https://stackoverflow.com/questions/794248/a-method-to-reverse-effect-of-java-string-split
'programing' 카테고리의 다른 글
Python과 줄바꿈을 사용하여 파일에 목록 작성 (0) | 2022.10.26 |
---|---|
의존성 주입 생성자의 광기를 방지하는 방법 (0) | 2022.10.26 |
SELECT 쿼리에서 계산된 필드를 재사용할 수 있습니까? (0) | 2022.10.25 |
두 태그 사이의 JavaScript regex 다중 행 텍스트 (0) | 2022.10.25 |
VueJS 템플릿에서 동적 이름과 동적 구성 요소를 사용하여 슬롯 목록을 선언하려면 어떻게 해야 합니까? (0) | 2022.10.25 |