全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1482
推到 Plurk!
推到 Facebook!

請問一下如何得到集合的個數??

答題得分者是:hagar
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-11-21 17:21:40 IP:203.66.xxx.xxx 未訂閱
請問一下如何取得集合的個數,或是判斷此集合被 assign 值?? 不會要用每個 element 去 Check 吧??
huangeider
高階會員


發表:288
回覆:492
積分:231
註冊:2003-02-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-11-21 17:46:15 IP:61.231.xxx.xxx 未訂閱
procedure TForm1.FormActivate(Sender: TObject); var I,j : Integer; begin j:=0; For I:=0 to Form1.ComponentCount-1 do begin if Form1.Components[I].ClassType=Tbutton then j:=j 1; end; label1.caption:='有' inttostr(j) '個 TBUTTON'; end; 「堅持」從洗馬桶做起 Aric
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-11-21 18:06:11 IP:202.39.xxx.xxx 未訂閱
http://codecentral.borland.com/codecentral/ccweb.exe/listing?id=14018 http://groups.google.com.tw/groups?hl=zh-TW&lr=&ie=UTF-8&inlang=zh-TW&th=4673f01682b874f7&rnum=3 --- Everything I say is a lie. 發表人 - hagar 於 2003/11/21 18:15:05
solnone
中階會員


發表:2
回覆:97
積分:69
註冊:2003-05-06

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-11-23 17:19:26 IP:203.66.xxx.xxx 未訂閱
// 以 TAlignSet 為例 procedure TForm1.Button1Click(Sender: TObject); var align: TAlignSet; begin align := []; // 是否為空 set if align = [] then Memo1.Lines.Add('[]'); // 加入 alTop, alRight 這二個 element include( align, [alTop, alRight]); // set 中是否有 alRight 這個 element if alRight in align then Memo1.Lines.Add('Have alRight'); end;
solnone
中階會員


發表:2
回覆:97
積分:69
註冊:2003-05-06

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-11-23 17:24:20 IP:203.66.xxx.xxx 未訂閱
// sorry, include 寫錯了!要一個一個加入 // 以 TAlignSet 為例 procedure TForm1.Button1Click(Sender: TObject); var align: TAlignSet; begin align := []; // 是否為空 set if align = [] then Memo1.Lines.Add('[]'); // 加入 alTop, alRight 這二個 element include(align, alTop); include(align, alRight); // set 中是否有 alRight 這個 element if alRight in align then Memo1.Lines.Add('Have alRight'); end;
elase
一般會員


發表:4
回覆:23
積分:10
註冊:2003-06-05

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-11-24 19:22:04 IP:61.219.xxx.xxx 未訂閱
一般來說我們不會知道集合的個數 要處理的時候會用 High() 及 Low() 這二個函數 利用 For 迴圈一個一個處理 如果想知道集合對應的值可以用 Ord()  
 
EX:    procedure TForm1.Button1Click(Sender: TObject);
type Rainbow = (Red,Orange,Yellow,Green,Bule,Indigo,Purple);
var i:Rainbow; //i 宣告為 Rainbow 型態
begin
  for i:= low(Rainbow) to high(Rainbow) do
    ShowMessage(inttostr(ord(i))); 
    //因為用 Ord() 得到的值是 Integer 所以要轉換           
end;
輸出的結果會從 0 ~ 6
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-11-25 10:48:52 IP:203.203.xxx.xxx 未訂閱
引言: // sorry, include 寫錯了!要一個一個加入 // 以 TAlignSet 為例 procedure TForm1.Button1Click(Sender: TObject); var align: TAlignSet; begin align := []; // 是否為空 set if align = [] then Memo1.Lines.Add('[]'); // 加入 alTop, alRight 這二個 element include(align, alTop); include(align, alRight); // set 中是否有 alRight 這個 element if alRight in align then Memo1.Lines.Add('Have alRight'); end;
align := align [alTop] [alRight];
speedup
資深會員


發表:19
回覆:259
積分:280
註冊:2003-07-04

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-11-25 14:30:13 IP:61.224.xxx.xxx 未訂閱
引言: 請問一下如何取得集合的個數,或是判斷此集合被 assign 值?? 不會要用每個 element 去 Check 吧??
當及集合的元素範圍小於8可以用轉型為Byte,小於16可以轉型為word,delphi利用該形態的每一bit來表示該元素是否存於該集合之中 以下函數可偵測集合的元素範圍小於32的集合元素數量
function CalcSetCount(aSet:Cardinal):integer;
var i :integer;
begin
 result := 0 ;
 for i := 0 to 31 do 
  if ((aSet shr i ) and $01)=$01 then inc(result);  
end;    
測試的程式碼
type
  TTestSet = (sOne, sTwo, sThree, sFour, sFive, sSix, sSeven,sEight,sNine);
  TMySet = set of TTestSet;    procedure TForm1.Button1Click(Sender: TObject);
var
 aSet:TMySet;
begin
 aSet := [sOne,sThree];
 showmessage(InttoStr(CalcSetCount(word(aSet))));
end;
混心雜欲 棄修身~唉
------
唉~
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-12-01 10:41:41 IP:203.66.xxx.xxx 未訂閱
引言: 當及集合的元素範圍小於8可以用轉型為Byte,小於16可以轉型為word,delphi利用該形態的每一bit來表示該元素是否存於該集合之中 以下函數可偵測集合的元素範圍小於32的集合元素數量
function CalcSetCount(aSet:Cardinal):integer;
var i :integer;
begin
 result := 0 ;
 for i := 0 to 31 do 
  if ((aSet shr i ) and $01)=$01 then inc(result);  
end;    
測試的程式碼
type
  TTestSet = (sOne, sTwo, sThree, sFour, sFive, sSix, sSeven,sEight,sNine);
  TMySet = set of TTestSet;    procedure TForm1.Button1Click(Sender: TObject);
var
 aSet:TMySet;
begin
 aSet := [sOne,sThree];
 showmessage(InttoStr(CalcSetCount(word(aSet))));
end;
混心雜欲 棄修身~唉
Sorry!! 上禮拜受訓,所以上禮拜沒有辦法整理測試 .. 今天測試後受益良多 .. 不過,完全命中我的問題是還是 hager ,經過我的測試 ..
function card(var tar; size: integer): integer;    // Returns the number of bits set in the Size bytes starting from Tar.    const // nibble table      Ca: array[0..15] of integer = (0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3,
    4);    var      ab: TbyteArray absolute tar;      j: integer;    begin      result := 0;      for j := 0 to size - 1 do
  begin        inc(result, Ca[ab[j] and $F]   Ca[ab[j] shr 4]);      end;    end; 
Card 這個 function 可以傳回 Set 的個數,經我測試 69 個,亦可正確顯示, Speedup 的解法有個數上的限制.. huangeider 可能誤解了我的意思 .. solnone 提供一個簡單判斷空集合方法(= []); elase 提供一個方法判斷集合的上下界; 感謝各位熱心回答,使我受益良多 ... 不過 Card Function 的演算法,我有一點看不太懂.. 可否請看懂的人解釋一下 .. nibble table 的作用為何??
speedup
資深會員


發表:19
回覆:259
積分:280
註冊:2003-07-04

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-12-01 14:32:33 IP:61.224.xxx.xxx 未訂閱
引言: Ca: array[0..15] of integer = (0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 不過 Card Function 的演算法,我有一點看不太懂.. 可否請看懂的人解釋一下 .. nibble table 的作用為何??
ca是一個轉換表,讓你的演算法可以快四倍
數值    二進位     幾個bit
0       0000         0  ca[0]   
1       0001         1  ca[1]
2       0010         1  ca[2] 
3       0011         2  ca[3]
4       0100         1  ca[4]
...
15      1111         4  ca[15]
 
此演算法將傳入的byte(8bit) 再對拆成兩對(4bit =0~15),直接套對照表換算該組擁有幾個1 混心雜欲 棄修身~唉
------
唉~
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-12-02 11:27:46 IP:203.66.xxx.xxx 未訂閱
引言: ca是一個轉換表,讓你的演算法可以快四倍
數值    二進位     幾個bit
0       0000         0  ca[0]   
1       0001         1  ca[1]
2       0010         1  ca[2] 
3       0011         2  ca[3]
4       0100         1  ca[4]
...
15      1111         4  ca[15]
 
此演算法將傳入的byte(8bit) 再對拆成兩對(4bit =0~15),直接套對照表換算該組擁有幾個1
感謝 speedup 的提示,我看懂了,真是聰明的演算法, 利用 Ca 對照計算 1 的個數
系統時間:2024-04-29 4:55:10
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!