2009-07-06 5 views
4

삭제 된 문자를 삭제하고 삭제 문자를 추가하고 원래 위치 오프셋을 개 기억하고 싶다면 Java에서 큰 문자열을 조작해야합니다. 예 : "컴퓨터"라는 단어는 원래 텍스트의 오프셋 133에서 시작하여 위치 244로 이동합니다. 여전히 은 원래 위치 133에 있었던 정보를 원합니다. 가장 못 생기고 자원이 부족한 솔루션은 모든 문자의 원래 위치와 위치의 변경. 거기에 확실히 더 나은 솔루션뿐만 아니라, 더 복잡한 것들입니다. 내 문제에 대한 해결책이있는 좋은 텍스트 조작 라이브러리가 있습니까? 나는 바퀴를 재발 명하고 싶지 않다.원본 위치 오프셋을 유지하면서 텍스트 조작

감사합니다, 카이

+0

일종의 실행 취소/다시 실행 기능을 구현할 예정입니까? –

+0

어떤 종류의. Eclipse RCP를 기반으로하는 텍스트 분석 애플리케이션의 일부입니다. 예를 들어 사용자는 문서의 중요한 내용 만보고 전체 문서를 다시 볼 수 있습니다. 문제는 텍스트 위에 강조 표시된 하이라이트와 그래프 가장자리로 주석이 달려 있다는 것입니다. 따라서 원래 위치를 기억하는 것이 중요합니다. – Zardoz

답변

2

이 문자열은 얼마나 큽니까? 오늘날 이용 가능한 메모리의 양을 감안할 때, 무력이 갈 길이 될 것입니다.

단어 이동에 대해 이야기하지만 문자 위치는 저장하고 있습니다. 왜 단어 위치를 저장하지 않고 단어의 인스턴스 당 기록을 저장하십시오. 영리하고 필요할 때까지 flyweight pattern을 사용하여 이러한 개체의 인스턴스를 여러 개 저장하지 않아도됩니다. 즉, '문자열'객체는 하나의 '컴퓨터'단어 객체를 보유하지만 그 단어가 위치 133, 245, 667 등에서 발생한다는 것을 기록합니다 (필요에 따라 언제든지 기록).

+0

그래, 그게 내가 더 복잡한 해결책을 의미하는 것이다 ;-)하지만 당신 말이 맞아요. 아무도 멋진 일을위한 도서관을 찾지 못한다면, 나는 그렇게 할 것입니다. – Zardoz

1

당신이 언급하는 문제는 공식적으로 Delta EncodingLevenshtein Distance 관련되어있는 "String-to-string correction problem을"라고합니다. Here은 거리를 계산하는 코드입니다 (Java로 표시됨). 모든 차이 코드가 있습니다. 코드를 역 추적하거나 추적 할 수 있도록 단계를 추적하는 코드를 추가하기 만하면됩니다. 참고 : 단어 또는 문자를 "이동"하는 것은 함께 발생하는 동일한 단어의 삭제/삽입 쌍입니다.

문자, 단어 및 하위 문자열 이동 모두에 적용됩니다.

+0

좋은 지적이지만 편집 된 내용을 이미 알고 있으므로 Levenshtein 거리를 계산할 필요가 없다고 생각합니다. 예를 들어 문서 내에서 무언가가 삭제되면 항상 "정보를 얻습니다." – Zardoz

0

효율성을 강조하기 전에, 봉투 계산을해라. 당신이 괜찮 으면 코드를 가지고, 당신은 profiler/스톱워치로 다시 확인하실 수 있습니다.

스윙 텍스트 형태로 준비된 솔루션이 있습니다. IIRC는 EDT (일반적인 스윙 스레드 - 적대적인 방식으로)에서 예외를 발생 시키려고 시도하지만 IIRC는 스윙 컨텍스트 외부에서 사용할 수 있어야합니다. 삽입 및 삭제 후에도 Document 내의 문자 위치를 추적하는 Position 개체가 있습니다. 그 밖의 것이 없다면 어떻게 할 수 있는지 보여줄 것입니다. 아마도 Apache Harmony 구현에는 대부분의 일반 사람들에게 적합한 라이센스가 제공됩니다.