2009-09-14 2 views
2

String에는 StringBuilder에서 완전히 누락 된 String.replace(CharSequence, CharSequence)과 같은 유용한 방법이 포함되어 있습니다. 왜 그런 이유가 있습니까?StringBuilder.replace (String, String)를 문자열로 구현하는 방법은 무엇입니까?

매번 문자열을 복사하는 StringBuilder.toString()을 호출하는 엄청난 오버 헤드없이 이러한 방법을 구현하는 쉬운 방법이 있습니까?

+0

거대한 오버 헤드? –

+1

@Tom : 많은() 호출을 수행하고 거대한 StringBuilder를 사용하면 "잠재적으로 큰 오버 헤드"라고 말하고 싶습니다. 그 경우 String 대신 Ropes를 사용할 것을 제안합니다. http://ahmadsoft.org/ropes/ –

+0

로프 인터페이스가 내용의 하위 집합 또는 모든 가변성을 대체하는 것으로 나타나지 않습니다. 목적은 StringBuilder의 대체 기능을 복제하는 것입니다. – Jherico

답변

4

StringBuilderindexOf(String,int)replace(int,int,String)을 모두 제공하므로 쉽게 기능을 재현 할 수 있습니다. 여기서 유일한 단점은 인수가 CharSequence 오브젝트가 될 수 없지만 대신 String이어야한다는 것입니다.

거대한 문자열과 같은 객체를 처리하고 많은 대체 작업을 수행하는 경우 Ropes for Java과 같은 특수 API를 사용할 수 있습니다.

+0

indexOf()는 toCharArray()로 정의되고 repace()는 expandCapacity() 및 System.arrayCopy()로 정의된다. 원래 포스터가 찾고있는 것이 단순히 StringBuilder.toString()을 호출하는 것보다 효율적이라면 효율적이지 않습니다. – Jherico

+0

나는이 RFE를 Sun에 제출했습니다. http://bugs.sun.com/view_bug.do?bug_id=6882490 – Gili

+0

답변에 Ropes에 대한 링크를 추가하면 동의로 표시됩니다. – Gili

0

음, Pattern.matcher()는 CharSequence를 취하므로 원래 작성기에 대해 새 String으로 복사하지 않고도 일치 작업을 수행 할 수 있습니다.

바꾸기가 중요하지 않은 경우 (길이가 같지 않은 텍스트 인 경우) Matcher를 사용하여 검색/바꾸기와 마찬가지로 새 StringBuilder에 복사 할 가능성이 큽니다. 그렇지 않으면 StringBuilder 중간에 삽입/삭제시 뒤 따르는 데이터를 복사해야하기 때문에 원래 StringBuilder에서 여러 번 데이터를 다시 복사 할 수 있습니다.

관련 문제