有没有办法从SplitString函数(Delphi XE,StrUtils)产生的动态数组中排除空白字符串,而不必遍历数组?

如果没有,谁能建议最有效的方法呢?现在,我正在这样做:

function SplitStringNoEmpty(myString : string; myDelimiters : string):TStringDynArray;
var
    words_array_pre : TStringDynArray;
    words_array_pos : TStringDynArray;
    array_length : Integer;
    actual_length : Integer;
    current_word : string;

    procedure AddElement(const Str: string);
    begin
      words_array_pos[actual_length]:= Str;
      inc(actual_length);
    end;
begin
    words_array_pre:= SplitString(myString, whitespaceNewLineCharacterSet + punctuationCharacterSet);
    array_length:= Length(words_array_pre);
    if (array_length >0) then
    begin
      actual_length:= 0;
      SetLength(words_array_pos, array_length);
      for current_word in words_array_pre do
      begin
        if (current_word <> '') then
          AddElement(current_word);
      end;
      SetLength(words_array_pos, actual_length);
      result:= words_array_pos;
    end
    else
      result:= words_array_pre;
end;

最佳答案

在不迭代数组的情况下删除数组的某些元素是不可能的-您还如何知道要删除哪些元素?对代码进行的改进是消除了分配额外数组的需要。您可以就地剔除原始数组:

function SplitStringNoEmpty(const s, delimiters: string): TStringDynArray;
var
  Src, Dest: Integer;
begin
  Result := SplitString(s, delimiters);
  if Length(Result) <> 0 then begin
    // Push all non-empty values to front of array
    Dest := 0;
    for Src := 0 to High(Result) do
      if Result[Src] <> '' then begin
        if Src <> Dest then
          Result[Dest] := Result[Src];
        Inc(Dest);
      end;
    // Remove excess from end of array
    SetLength(Result, Dest);
  end;
end;

关于string - 使用SplitString消除空白字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9981898/

10-10 22:40