2016-10-07 4 views
2

파스칼 스크립트의 다른 문자열에서 문자열이 몇 번이나 발생하는지 계산하려고합니다. 아래 예와 같습니다.Pascal Script Count 문자열이 다른 문자열에서 발생하는 횟수

나는 Delphi: count number of times a string occurs in another string에 대한 답을 보았지만, 파스칼 스크립트에는 PosEx 기능이 없습니다. I는 Hello 또는 World 여기서 발생 횟수를 카운트하면 I가 , (쉼표) 여기서 발생 횟수를 카운트하는 경우

MyString := 'Hello World!, Hello World!, Hello World!, Hello World!'; 

결과 4.

이어야 결과는 3이 될 것이다.

UPDATE는

다음 기능은 작동하지만, 사본은 새로운 변수로 다시 문자열을 부여하고, 문자열의 일부를 삭제 그래서 천천히 작동합니다.

function OccurrencesOfSubString(S, SubStr: String): Integer; 
var 
    DSStr: String; 
begin 
    if Pos(SubStr, S) = 0 then 
    Exit 
    else 
    DSStr := S; 
    Repeat 
    if Pos(SubStr, S) <> 0 then 
    Inc(Result); 
    Delete(DSStr, Pos(SubStr, DSStr), Length(Copy(DSStr, Pos(SubStr, DSStr), Length(SubStr)))); 
    Until Pos(SubStr, DSStr) = 0; 
end; 
+0

이것은 코드 작성 서비스가 아닙니다. 이 일을 직접 해본 적이 있습니까? PosEx 없이도이 작업을 수행 할 수 있습니다. PosEx가 존재하기 전에 수십 년 동안 해왔습니다. –

+0

예 예상 한대로 작동하지 않기 때문에 완료되었지만 코드를 게시 할 수 없습니다. – GTAVLover

+3

그런 다음 작동하지 않는 코드를 게시하고 해당 코드에 대해 특정 질문 *을하십시오. 다시 말하지만, 이것은 요구 사항과 선택 언어를 게시하고 누군가가 코드를 작성하는 코드 작성 서비스는 아닙니다. –

답변

3

귀하의 구현은 일반적으로 정확합니다.

제거 약간 만들어 질 최적화 쓸모 코드가 있습니다

  • if Pos(SubStr, S) <> 0 (repeat 내)에 대한 두 번째 시험은 무의미하다. 항상 사실입니다. 이미 함수 시작에서 테스트 된 S을 테스트하고 있습니다. DSStr은 이미 until에서 테스트되었습니다.
  • Pos(SubStr, DSStr)을 여러 번 호출하지 않는 변수에 저장해야합니다.
  • Length(Copy(DSStr, Pos(SubStr, DSStr), Length(SubStr)))은 실제로 Length(SubStr)과 동일합니다.
  • SDSStr으로 복사 할 필요가 없습니다. S으로 직접 작업 할 수 있습니다. 이것은 by-value 매개 변수이므로 함수를 호출하는 데 사용하는 변수는 수정하지 마십시오.
  • 처음 Pos(SubStr, S) = 0 검사를 루프의 동일한 검사로 바꾸고 하나의 Pos 호출을 저장합니다. 코드의

최적화 된 버전 :

function OccurrencesOfSubString(S, SubStr: String): Integer; 
var 
    P: Integer; 
begin 
    Result := 0; 
    repeat 
    P := Pos(SubStr, S); 
    if P > 0 then 
    begin 
     Inc(Result); 
     Delete(S, P, Length(SubStr)); 
    end; 
    until P = 0; 
end; 

그러나 실제로 이노 설정 StringChange function (델파이는하지 않음)와

, 당신은 어떤 알고리즘을 직접 코딩 할 필요가 없습니다.
function OccurrencesOfSubString(S, SubStr: String): Integer; 
begin 
    Result := StringChange(S, SubStr, ''); 
end; 

@RobertFrank's answer to Delphi: count number of times a string occurs in another string에 의해 영감을했다.

StringChange의 사용은 비효율적이지만 (중요한 부작용이 있으므로) 실제로 더 빠릅니다. 아마 파스칼 스크립트가 아니라 파스칼로 구현 되었기 때문일 것입니다.

OccurrencesOfSubString('Hello World!, Hello World!, Hello World!, Hello World!', 'Hello') 
  • StringChange으로 : 11초
  • 코드의 내 최적화 된 버전 : 49초
  • 원래 코드 : 99초

는에 300 만 호출로 테스트

전화가 거의없는 경우에도 모든 구현이 충분합니다.

+0

고마워! 작동!, 충분한 시간이 없었기 때문에, 나는 내 질문을 내 기능으로 업데이트하는 데 늦어졌다. :-( – GTAVLover

+0

훌륭한 도움에 감사드립니다! 내가'S '와 직접 일한다면, 최적화 된 버전의 함수를 호출 한 후에'S'의 내용이 손실되지 않을까요? By-Value가 무엇을 의미합니까? – GTAVLover

+0

매개 변수를'S : string'으로 선언하면 값은 (복사에 의해) 전달되므로 함수의'S'에 대한 수정은 문자열 복사본에서 수행되고 사용 된 변수에는 영향을 미치지 않습니다 이 함수는 상수 문자열을 가진 호출이 될 수 있음에 유의하라 - 'var S : string'으로 선언 된 매개 변수의 반대 - 참조로 전달된다.'S '를 수정하면 변수가 수정된다. 함수를 호출하는 데 사용됩니다. 따라서 상수를 수정할 수 없으므로 매개 변수에 상수 문자열을 사용할 수 없습니다. –