代码如下: procedure TForm1.Button1Click(Sender: TObject); var i, a, b: integer; s: string; slData: TStringList; begin slData := TStringList.Create; try slData.CommaText := '0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,55,56,57,58, 87,88,89,90,91,92'; Memo1.Lines.Add(slData.Text); s := ''; for i := 0 to slData.Count - 2 do begin a := StrToIntDef(slData.Strings[i], 0); b := StrToIntDef(slData.Strings[i+1], 0); if b - a <> 1 then s := s +','+ IntToStr(a+1) +'-'+ IntToStr(b-1); end; if s <> '' then begin s := Copy(s, 2, Length(s) - 1);//去掉第一个逗号 Memo1.Lines.Add(s); end; finally slData.Free; end; end;
function PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer; //(加单元:StrUtils)
procedure TForm1.Button1Click(Sender: TObject);
var
i, a, b: integer;
s: string;
slData: TStringList;
begin
slData := TStringList.Create;
try
slData.CommaText := '0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,55,56,57,58, 87,88,89,90,91,92';
Memo1.Lines.Add(slData.Text);
s := '';
for i := 0 to slData.Count - 2 do
begin
a := StrToIntDef(slData.Strings[i], 0);
b := StrToIntDef(slData.Strings[i+1], 0);
if b - a <> 1 then
s := s +','+ IntToStr(a+1) +'-'+ IntToStr(b-1);
end; if s <> '' then
begin
s := Copy(s, 2, Length(s) - 1);//去掉第一个逗号
Memo1.Lines.Add(s);
end;
finally
slData.Free;
end;
end;
strList:=Tstringlist.create;
Delimiter:=',';
DelimitedText:=slData.CommaText;
现在每个数都存入了Tstringlist。
我这个是已排序好的数了,那么断开的那个数+1是最小的,断开的最后一个数字-1是最大的
str1等于'0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,55,56,57,58, 87,88,89,90,91,92
那么:
22+1是最小的
87-1是最大的
思路是这样,算法自己搞定吧
StrUtils.SplitString,分解为数组后,就很容易处理了。