[java] C # 또는 Java : 문자열 앞에 StringBuilder를 추가 하시겠습니까?

을 사용하여 문자열을 추가 할 수 있다는 것을 알고 있습니다 StringBuilder. 제공 StringBuilder하는 성능 이점을 유지할 수 있도록을 사용하여 문자열 앞에 추가 (즉, 문자열 앞에 문자열 추가) 할 수있는 방법이 StringBuilder있습니까?



답변

위치 매개 변수를 0으로 설정하고 삽입 방법을 사용하는 것은 앞에 추가하는 것과 같습니다 (즉, 시작 부분에 삽입).

예 : varStringBuilder.insert(0, "someThing");

C #Java 모두에서 작동합니다.


답변

문자열을 앞에 붙이려면 일반적으로 삽입 지점 이후의 모든 항목을 백업 배열의 일부 뒤로 복사해야하므로 끝에 추가하는 것만 큼 빠르지는 않습니다.

그러나 Java에서는 다음과 같이 할 수 있습니다 (C #에서는 동일하지만 메서드가 호출 됨 Insert).

aStringBuilder.insert(0, "newText");


답변

많은 접두어가있는 고성능이 필요한 경우 고유 한 버전을 작성해야합니다 StringBuilder(또는 다른 사람의 버전을 사용해야합니다). 표준 StringBuilder(기술적으로는 다르게 구현 될 수 있지만)을 사용하면 삽입 지점 이후에 데이터를 복사해야합니다. n 개의 텍스트를 삽입하는 데 O (n ^ 2) 시간이 걸릴 수 있습니다.

순진한 접근 방식은 char[]길이뿐만 아니라 백업 버퍼에 오프셋을 추가하는 것 입니다. 앞에 추가 할 공간이 충분하지 않은 경우 꼭 필요한 것 이상으로 데이터를 위로 이동하십시오. 이것은 성능을 다시 O (n log n) (제 생각에)로 낮출 수 있습니다. 보다 세련된 접근 방식은 버퍼를 주기적으로 만드는 것입니다. 이러한 방식으로 어레이의 양쪽 끝에있는 여유 공간이 연속됩니다.


답변

확장 방법을 시도해 볼 수 있습니다.

/// <summary>
/// kind of a dopey little one-off for StringBuffer, but 
/// an example where you can get crazy with extension methods
/// </summary>
public static void Prepend(this StringBuilder sb, string s)
{
    sb.Insert(0, s);
}

StringBuilder sb = new StringBuilder("World!");
sb.Prepend("Hello "); // Hello World!


답변

문자열을 반대로 만든 다음 결과를 반대로 할 수 있습니다. O (n ^ 2) 최악의 경우 비용 대신 O (n) 비용이 발생합니다.


답변

나는 그것을 사용하지 않았지만 Ropes For Java Sounds는 흥미 롭습니다. 프로젝트 이름은 단어 놀이입니다 . 진지한 작업을 위해 문자열 대신 로프 를 사용하십시오 . 준비 및 기타 작업에 대한 성능 저하를 피합니다. 이 일을 많이한다면 한 번 볼 가치가 있습니다.

로프는 Strings의 고성능 대체품입니다. “로프 : 문자열의 대안”에 자세히 설명 된 데이터 구조는 접두사, 추가, 삭제 및 삽입과 같은 일반적인 문자열 수정에 대해 String 및 StringBuffer보다 점근 적으로 더 나은 성능을 제공합니다. 문자열과 마찬가지로 로프는 불변이므로 다중 스레드 프로그래밍에 사용하기에 적합합니다.


답변

Java의 StringBuilder 클래스를 사용하여 앞에 추가하려는 경우 수행 할 수있는 작업은 다음과 같습니다.

StringBuilder str = new StringBuilder();
str.Insert(0, "text");