IT

C # String.Format () 및 String.Join ()에 해당하는 Java

lottoking 2020. 8. 3. 17:25
반응형

C # String.Format () 및 String.Join ()에 해당하는 Java


나는 약간의 약간의 질문이라는 것을 알고 있다고 Java에서 C #의 많은 연산과 동등한 것이 있습니까?

특히에 대해 이야기 String.Format하고 String.Join있습니다.


자바 문자열에는 object- format메서드 있지만 (1.5) join메서드가 없습니다 .

아직 포함되지 않은 유용한 유용한 문자열 유틸리티를 얻을 수 있습니다 . org.apache.commons.lang.StringUtils를 사용할 수 있습니다 .


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

위의 내용은 http://snippets.dzone.com/posts/show/91 에서 온 것입니다 .


구아바 와 함께 제공 클래스 .Joiner

import com.google.common.base.Joiner;

Joiner.on(separator).join(data);

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에서 사용할 수 있습니다.


다음과 같이 사용할 수있는 변수 인수를 사용할 수 있습니다.

  String join (String delim, String ... data) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < data.length; i++) {
      sb.append(data[i]);
      if (i >= data.length-1) {break;}
      sb.append(delim);
    }
    return sb.toString();
  }

복잡해 복잡해 복잡하다고 생각합니다.

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

여러 문자열을 하나로 결합 (연결)하려면 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();
}

하지만 CollectionJSP에서 지원하지 않으므로 태그 기능에 대해 다음과 같이 썼습니다.

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은 쉼표 구분 기호와 대괄호를 사용하여 전체 컬렉션의 값을 저장합니다.


문자열 연결 연산자 "+"를 사용하여 두 문자열을 결합합니다. s1 += s2;

참고 URL : https://stackoverflow.com/questions/187676/java-equivalents-of-c-sharp-string-format-and-string-join

반응형