2012-05-12 45 views
1

這些天我正在處理自己的一個小例子/項目。我正在做的是創建n一組隨機字符串可變長度。這是我想要得到的:將隨機生成的字符串作爲嵌套表插入

  • 長度從3到25個字符的兩個名字。
  • 消息範圍從40到300個字符。

在我的C例子中,我創建了一個struct並不斷插入此表中作爲列表。在我的LUA例如,我要一個嵌套表是這樣的:

tTableName = { 
    [1] = { 
    "To" = "Name 1", 
    "From" = "Name 2", 
    "Message" = "The first message generated" 
    } 
    [2] = { 
    "To" = "Name 3", 
    "From" = "Name 4", 
    "Message" = "The second message generated" 
    } 
} 

所以,基本上我的結構是這樣的:

struct PM { 
    char *sTo, *sFrom, *sMessage; 
} PMs; 

我想在LUA類似的結構/表,以便我可以使用方法table.insert。我目前正在這樣做:

tTempTable = { 
    "To" = "Name 1", 
    "From" = "Name 2", 
    "Message" = "The first message generated" 
} 
table.insert(tTableName, tTempTable) 

但我認爲這是浪費了大量的處理時間。目前,我只生成這樣的PM的樣品,例如;但後來我會生成* *其中的一個。請指教。

+2

我不確定你在問什麼...你想要什麼建議?另外,這些表構造函數不是有效的lua。 – daurnimator

回答

2

我認爲在你甚至知道瓶頸在哪裏之前,你會陷入早熟的優化代碼的陷阱......但是下面的文檔包含了大量有關lua的優化信息,包括表格。這個人寫的是Lua的首席架構師之一。

http://www.lua.org/gems/sample.pdf

+0

非常感謝那本書。 :) – hjpotter92

1

首先,這是不是一個真正的問題。我猜你在問是否有更高效的方法來做到這一點?一般來說,你想寫的清晰度和don't sweat small performance gains at all unless you run into issues.但是這裏有一些關於你的代碼的筆記,包括關於效率的一些注意事項:

發佈的表構造函數無效。以下任一修補程序都可以使用:

tTempTable = { 
    ["To"] = "Name 1", 
    ["From"] = "Name 2", 
    ["Message"] = "The first message generated" 
} 
tTempTable = { 
    To = "Name 1", 
    From = "Name 2", 
    Message = "The first message generated" 
} 

構建數組時不需要指定數字索引。您可以替換此:

tTableName = { 
    [1] = { To = "Name 1", From = "Name 2", Message = "The first message generated" }, 
    [2] = { To = "Name 3", From = "Name 4", Message = "The second message generated" }, 
} 

有了這個,這意味着同樣的事情,但更簡潔:

tTableName = { 
    { To = "Name 1", From = "Name 2", Message = "The first message generated" }, 
    { To = "Name 3", From = "Name 4", Message = "The second message generated" }, 
} 

這也恰好是更有效的; Lua可以預先分配它需要的數組大小,但它不足以用前面的構造函數來完成。

至於更好的方式來寫這個在一般情況下,很難說如果不知道更多關於您的應用程序。如果你只是想測試一些PM代碼,爲什麼不直接在使用時生成你需要的字符串呢?爲什麼將它們預先分配到表中?

如果您必須預分配,則不必將它們存儲爲結構化數據。你可以只有三個陣列:ToNames,FromNames,Messages,然後在使用點隨機選擇:

local to  = ToNames [ math.random(1,#ToNames ) ] 
local from = FromNames[ math.random(1,#FromNames) ] 
local message = Messages [ math.random(1,#Messages) ] 
TestPM(to, from, message) 
+0

感謝您的提示。我也是隨機創建消息(他們可能會/也許不會有語法意義,但仍然是句子。我現在將PM作爲預先格式化的字符串進行合併,並使用字符串從字符串中提取to/from/message標題'string.find'。謝謝你的鏈接,以及追加插入的想法。 – hjpotter92

+0

你的關於table.insert的提示實際上是不準確的。如果你沒有指定table.insert的索引,插入的默認位置是n + 1,其中n是表格的長度(即結尾)......你可以在lua參考手冊中驗證它。 –

+0

@Mike Cocoran:對,你是。 – Mud