1

「mango」という行がたくさんあるメモがあり、「mango」というテキストが何回見つかったかを数えたいと思います。

var
  f, mango: Integer;
begin
  mango := 0;
  for f := 0 to m0.lines.Count - 1 do
  begin
    if AnsiContainsStr(m0.lines[f], 'mango') then
    begin
      mango := mango + 1;
      m0.lines.Add(IntToStr(mango));
    end
  end;
end;

しかし、たとえば、「mango」エントリが 6 つ見つかった場合、結果は次のようになります。

1
2
3
4
5
6

どうすれば結果を6だけにすることができますか?

4

1 に答える 1

7

メモに合計のみを表示したい場合は、次のようにする必要があります。

var
  f, mango: Integer;
begin
  mango := 0;
  for f := 0 to m0.lines.Count - 1 do
  begin
    if AnsiContainsStr(m0.lines[f], 'mango') then
    begin
      mango := mango + 1;
    end
  end;
  m0.lines.Add(IntToStr(mango));    // This line needs to be outside of your loop
end;

増分されるたびにリストにカウントを追加していました。

このために再利用可能な関数が必要な場合は、次のようなものを使用できます。

function CountStringListTexts(const ASearchList: TStrings; const ASearchText: string): Integer;
var
  f: Integer;
begin
  Result := 0;
  for f := 0 to ASearchList.Count - 1 do
  begin
    if AnsiContainsStr(ASearchList[f], ASearchText) then
    begin
      Result := Result + 1;
    end
  end;
end;

これを使用するには、次のようにします。

m0.lines.Add(IntToStr(CountStringListTexts(m0.Lines, 'mango')));

これは、クラス ヘルパーにすることもできます。

type
  TSClassHelper = class helper for TStrings
    function CountMatchTexts(const ASearchText: string): Integer;
  end;

function TSClassHelper.CountMatchTexts(const ASearchText: string): Integer;
var
  f: Integer;
begin
  Result := 0;
  for f := 0 to Self.Count - 1 do
  begin
    if AnsiContainsStr(Self.Strings[f], ASearchText) then
    begin
      Result := Result + 1;
    end
  end;
end;

これを使用すると、非常に簡単になります。あなたはただするでしょう:

m0.lines.Add(IntToStr(m0.Lines.CountMatchTexts('mango')));
于 2014-05-04T06:07:01.497 に答える