現在我的TList中有很多與坐標有關的內容,大概有30萬條,如:
10-10-1
10-10-2
10-10-3
20-10-2
20-10-1
10-10-4
前面的是x和y坐標,最后一位是該坐標的標記,我現在需要把坐標相同的只保留最后面的一條,處理后的結果如下:
20-10-1
10-10-4
哪位大俠幫個忙啊!!!
uj5u.com熱心網友回復:
遍歷Tlist然后排序Tlist然后從后往前截取x和Y的 判斷是否當前x和y是否和前面的一致..一致就洗掉
我是這樣想的
uj5u.com熱心網友回復:
利用Tstringlist,直接可以排序了uj5u.com熱心網友回復:
將前四位數,視為是0000-9999的索引,用另一個TList做記錄。
在原本TList從第一筆到最后一筆,取出前四位成索引,
設定新List[Index]='A'
最后,新List從0-9999跑一圈,凡值是'A'的就是所有內容。
uj5u.com熱心網友回復:
我的內容太多了,遍歷后計算機運算不過來uj5u.com熱心網友回復:
我給的方案,只是二次遍歷,是很快的演算法了。如果我說的沒錯,用排序會更慢。
其實,更正確的做法是在獲得資料時就用我上述方案的新List處理,
那就飛快,完全沒有遍歷的問題。
uj5u.com熱心網友回復:
排序本身就是在遍歷而且才30萬而已,啥計算機會運算不過來。。。
uj5u.com熱心網友回復:
1.遍歷,洗掉相同的2.不想寫代碼的話,可把資料保存至資料庫的表里,用SQL處理
uj5u.com熱心網友回復:
菜鳥一枚,還是說說?30W要遍歷還是費時間的,LS說的,在資料庫里面做,這樣高效點。
個人覺得還是演算法好,那么可以解決很多問題
uj5u.com熱心網友回復:
一,在資料庫中做;二,引入ID列,給每條資料引入唯一標識;
三,將你的這一個欄位拆為兩個欄位,10-10-1拆成10-10-,1
四,用GROUP BY HAVING COUNT 函式查出重復資料的所有最大ID(不知道怎么用可以百度查),
五,洗掉非最大ID資料;
六,將兩個欄位合成一個欄位。
uj5u.com熱心網友回復:
排序的演算法是久經考驗的,一般肯定比自己遍歷會快。。。。。
uj5u.com熱心網友回復:
遍歷后放到hash表里存放,重復的專案會很容易被發現。uj5u.com熱心網友回復:
Const
piXMax = 4000; //假設X最大值
piYMax = 3000; //假設Y最大值
type
TXYList = array [0..piXMax*piYMax-1] of Byte;
PXYList = ^TXYList;
function SplitStr(Const sLine : String; var xy : integer) : Boolean;
var
i , x , y : integer;
P : PChar;
begin
Result := False;
if sLine='' then exit;
P := Pointer(sLine);
x := -1;
y := -1;
for i:=0 to Length(sLine)-1 do begin
if P[i]='-' then begin
if x<0 then x := i
else begin
y := i;
Break;
end;
end;
end;
if y<=0 then exit;
if TryStrToInt(Copy(sLine , 1 , x) , xy) then begin
xy := xy * piYMax;
if TryStrToInt(Copy(sLine , x+2 , y-x-1) , y) then begin
xy := xy + y;
Result := y<piYMax;
end;
end;
end;
procedure RemoveXYRep(InList , OutList : TStringList);
var
i , xy : integer;
List : PXYList;
sLine : String;
begin
GetMem(List , SizeOf(List^));
FillChar(List^ , SizeOf(List^) , 0);
OutList.BeginUpdate;
OutList.Clear;
for i:=InList.Count-1 downto 0 do begin //從后往前搜索
sLine := InList.Strings[i];
if SplitStr(sLine , xy) then begin //計算所引
if List[xy]=0 then begin //如果x,y不存在
List[xy] := 1; //設定為存在
OutList.Add(sLine); //增加到OutList中,從后往前增加
end;
end;
end;
//把順序倒過來
xy := OutList.Count-1;
for i:=0 to OutList.Count DIV 2 - 1 do begin
OutList.Exchange(i , xy-i);
end;
OutList.EndUpdate;
FreeMem(List);
end;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/120010.html
標籤:VCL組件開發及應用
上一篇:求 北京的 delphi大神指點
