나는 이것이 약간의 초보자 질문이라는 것을 알고 있지만 Java에서 C #의 문자열 작업과 동등한 것이 있습니까?
특히, 나는에 대해서 이야기하고 String.Format
와 String.Join
.
나는 이것이 약간의 초보자 질문이라는 것을 알고 있지만 Java에서 C #의 문자열 작업과 동등한 것이 있습니까?
특히, 나는에 대해서 이야기하고 String.Format
와 String.Join
.
답변:
Java String 객체에는 format
메소드 (1.5 기준)가 있지만 join
메소드가 없습니다 .
아직 포함되지 않은 유용한 문자열 유틸리티 메소드를 얻으려면 org.apache.commons.lang.StringUtils를 사용할 수 있습니다 .
String.join()
메서드가 도입되었음을 반영하도록이 답변을 업데이트해야합니다 .
String.format . 조인에 관해서는 직접 작성해야합니다.
static String join(Collection<?> s, String delimiter) {
StringBuilder builder = new StringBuilder();
Iterator<?> iter = s.iterator();
while (iter.hasNext()) {
builder.append(iter.next());
if (!iter.hasNext()) {
break;
}
builder.append(delimiter);
}
return builder.toString();
}
Java 8 join()
부터는 이제 String 클래스에서 두 개의 클래스 메소드로 사용할 수 있습니다. 두 경우 모두 첫 번째 인수는 구분 기호입니다.
개별 CharSequence
을 추가 인수로 전달할 수 있습니다 .
String joined = String.join(", ", "Antimony", "Arsenic", "Aluminum", "Selenium");
// "Antimony, Arsenic, Alumninum, Selenium"
또는 다음을 전달할Iterable<? extends CharSequence>
수 있습니다 .
List<String> strings = new LinkedList<String>();
strings.add("EX");
strings.add("TER");
strings.add("MIN");
strings.add("ATE");
String joined = String.join("-", strings);
// "EX-TER-MIN-ATE"
Java 8은 또한 다음 StringJoiner
과 같이 사용할 수 있는 새 클래스를 추가합니다 .
StringJoiner joiner = new StringJoiner("&");
joiner.add("x=9");
joiner.add("y=5667.7");
joiner.add("z=-33.0");
String joined = joiner.toString();
// "x=9&y=5667.7&z=-33.0"
TextUtils.join 은 Android에서 사용할 수 있습니다.
조인에 관해서는 이것이 조금 덜 복잡해 보일 수 있다고 생각합니다.
public String join (Collection<String> c) {
StringBuilder sb=new StringBuilder();
for(String s: c)
sb.append(s);
return sb.toString();
}
원하는만큼 Java 5 구문을 사용하지 못하므로 (믿거 나 말거나, 최근에 1.0.x를 사용하고 있습니다) 약간 녹슬었을 수 있지만 개념은 정확하다고 확신합니다. .
편집 추가 : 문자열 추가는 느려질 수 있지만 GUI 코드 또는 일부 단기 실행 루틴으로 작업하는 경우 .005 초 또는 .006이 걸리는지 여부는 실제로 중요하지 않으므로 "joinMe"라는 컬렉션이있는 경우 기존 문자열 "target"에 추가하려는 경우 다음과 같이 인라인하는 것이 끔찍하지 않습니다.
for(String s : joinMe)
target += s;
그것은 매우 비효율적이며 나쁜 습관이지만 수천 개의 문자열이 있거나 이것이 거대한 루프 안에 있거나 코드가 실제로 성능에 중요하지 않으면 인식 할 수있는 것은 없습니다.
더 중요한 것은 기억하기 쉽고 짧고 빠르며 매우 읽기 쉽다는 것입니다. 디자인 선택에서 성능이 항상 자동 승자가되는 것은 아닙니다.
여기에 아주 간단한 대답이 있습니다. +=
코드가 적기 때문에 사용 하고 최적화 프로그램이이를 a로 변환하도록하십시오 StringBuilder
. 이 방법을 사용하면 루프에서 "마지막"검사를 수행 할 필요가 없으며 (성능 향상) 끝에 구분 기호를 제거하는 것에 대해 걱정할 필요가 없습니다.
Iterator<String> iter = args.iterator();
output += iter.hasNext() ? iter.next() : "";
while (iter.hasNext()) {
output += "," + iter.next();
}
간단한 조인 기능을 추가하기 위해 전체 Apache 라이브러리를 가져오고 싶지 않았으므로 여기에 내 해킹이 있습니다.
public String join(String delim, List<String> destinations) {
StringBuilder sb = new StringBuilder();
int delimLength = delim.length();
for (String s: destinations) {
sb.append(s);
sb.append(delim);
}
// we have appended the delimiter to the end
// in the previous for-loop. Let's now remove it.
if (sb.length() >= delimLength) {
return sb.substring(0, sb.length() - delimLength);
} else {
return sb.toString();
}
}
removeCharAt
존재하지 않으며, 전체 기능이 더 이상 문자열을 반환 ...이 문제를 해결할 것이다.
여러 문자열을 하나로 결합 (연결)하려면 StringBuilder를 사용해야합니다. 사용하는 것보다 훨씬 낫습니다.
for(String s : joinMe)
target += s;
StringBuilder는 동기화를 사용하지 않기 때문에 StringBuffer보다 약간의 성능 향상이 있습니다.
이와 같은 범용 유틸리티 메서드의 경우 (결국) 여러 상황에서 여러 번 호출되므로 효율적으로 만들고 많은 임시 개체를 할당하지 않아야합니다. 우리는 많은 다양한 Java 앱을 프로파일 링했으며 거의 항상 문자열 연결 및 문자열 / char [] 할당이 상당한 시간 / 메모리를 차지한다는 사실을 발견했습니다.
재사용 가능한 컬렉션-> 문자열 메서드는 먼저 필요한 결과의 크기를 계산 한 다음 해당 초기 크기로 StringBuilder를 만듭니다. 이것은 문자열을 추가 할 때 사용되는 내부 char []의 불필요한 이중화 / 복사를 방지합니다.
나는 직접 썼다.
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().toString());
while (iter.hasNext()) {
sb.append(delim);
sb.append(iter.next().toString());
}
return sb.toString();
}
하지만 Collection
JSP에서 지원하지 않으므로 태그 기능에 대해 다음과 같이 썼습니다.
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, ", ")}
StringUtils 는 Apache Commons Lang 라이브러리에서 매우 유용한 클래스입니다.
이 MessageFormat.format()
C 번호의처럼 작동한다 String.Format()
.
여기에 String.Join의 지나치게 복잡한 구현이 많이 있습니다. Java 1.8이없고 새 라이브러리를 가져 오지 않으려는 경우 아래 구현으로 충분합니다.
public String join(Collection<String> col, String delim) {
StringBuilder sb = new StringBuilder();
for ( String s : col ) {
if ( sb.length() != 0 ) sb.append(delim);
sb.append(s);
}
return sb.toString();
}
ArrayList<Double> j=new ArrayList<>;
j.add(1);
j.add(.92);
j.add(3);
String ntop=j.toString(); //ntop= "[1, 0.92, 3]"
따라서 기본적으로 String ntop은 쉼표 구분 기호와 대괄호를 사용하여 전체 컬렉션의 값을 저장합니다.