2017-03-31 2 views
0

SciTEエディタには、エディタのテキストバッファにアクセスできる埋め込み型Luaスクリプトエンジンが付属しています。これにより、LuaでプログラムされたToolsでSciTEの機能を拡張し、ToolsメニューからSciTEの機能を拡張することができます。ここから入手できるそのようなツール:SciTEソート選択ツール:先頭に空白がある数字は、期待通りにソートされていません。

http://lua-users.org/wiki/SciteSortSelection

は、アルファベット順に選択された行をソートするためのツールです。私はむしろ期待

1 
    111 
    2 
    222 
    3 
    333 

1 
    2 
    3 
    111 
    222 
    333 

Googleと(株)ではない私にとっては迷惑な は/それが自分の番号順に番号を含む行をソートしませんが、このようにということであるでした私の知る限りではまだオンラインでこの問題の解決策がないので、多くの助けを借りている。また、table.sort()のLuaドキュメントを見つけて深く理解することも簡単です。だから知識のあるLuaプログラマのための質問は、既存のLuaスクリプトコードにパッチを当てる最良の方法は何であろうか。数字(そして先行するスペースの場合はテキストを含む行)が期待通りにソートされ、このタスクのLuaコード非常に高速で実行されるため、巨大なファイル(50 MByte以上)のソートにも時間がかかりません。

答えて

1

あなたの期待は間違っています。あなたはアルゴリズムがアルファベット順にテキストをソートすることになっていると言いました。

ルア「11」は「2」より小さい。 私はあなたが "aa"が "b"となることに同意すると思います。これはかなり同じことです。

テキストの並べ替え方法を変更する場合は、独自の機能を提供する必要があります。

Luaの参照マニュアルは言う:リストから

table.sortインプレース(リスト[、COMP])与えられた順に

ソートリスト要素は、[1] リストに[#リスト]。 compが指定されている場合、 は2つのリスト要素を受け取り、最初の要素 が最後の次の要素の前に来なければならないときにtrueを返します。 ソート後、i < jはcomp(リスト[j]、リスト[i]))。 compが指定されていない場合は、 標準のLua演算子<が代わりに使用されます。

comp関数では、リスト内の要素が を超える厳密な部分秩序を定義しなければならないことに注意してください。すなわち、それは非対称で、 推移でなければなりません。それ以外の場合は、有効な並べ替えができません。

並べ替えのアルゴリズムが安定していません。指定された順序で等しいと見なされる要素は、並べ替えによって相対位置が変更されることがあります。

したがって、独自のcomp関数を実装してソートを変更することは自由です。

デフォルトではtable.sort(list)昇順に並べ替えます。 ソート降順にそれを作るためにあなたが呼び出す:

t = {"111", "11", "3", "2", "a", "b"} 

local function myCompare(a,b) 
    local a_number = tonumber(a) 
    local b_number = tonumber(b) 
    if a_number and b_number then 
     return a_number < b_number 
    end 
end 

table.sort(t, myCompare) 

for i,v in ipairs(t) do 
    print(v) 
end 

出力

2 
3 
11 
111 
a 
b 
にあなたを与えるだろう:あなたは違った数字を扱いたい場合は

table.sort(list, function(a,b) return a > b end) 

は、あなたがこのような何かを行うことができます

もちろんこれは簡単で簡単な例です。より良い実装はあなた次第です。

0

私はついに自分自身を思いついた。それはすでに遅いが遅くなり、迅速かつ汚いソリューションは間違いないだろう

(jEditの[プラグイン]に比べて - > [テキストツール] - > [ソート行]または「ソート-g」コマンドラインをbashに)

テキスト行の巨大なバッファーをソートするプロセスですが、それは少なくとも使用のためにあり、期待どおりに動作します。ここでの完全性のために、私のLuaスタートアップスクリプトSciTEに現在入っているコードの全セクションは、

-- ============================================================================= 
-- Sort Selected Lines (available in MENU -> Tools): 
-- ----------------------------------------------------------- 
-- Specify in .SciTEUser.properties: 
--  command.name.2.*=# Sort Selected Lines ' 
--  command.subsystem.2.*=3 
--  command.mode.2.*=savebefore:no 
--  command.2.*=SortSelectedLines 
--  # command.shortcut.2.*=Ctrl+2 # Ctrl+2 is DEFAULT for command.2.* 

function lines(str) 
    local t = {} 
    local i, lstr = 1, #str 
    while i <= lstr do 
    local x, y = string.find(str, "\r?\n", i) 
    if x then t[#t + 1] = string.sub(str, i, x - 1) 
    else break 
    end 
    i = y + 1 
    end 
    if i <= lstr then t[#t + 1] = string.sub(str, i) end 
    return t 
end 

-- It was an annoying for me that using table.sort(buffer) in Lua 
-- didn't sort numbers with leading spaces in their numerical order. 
-- Using following comparison function helps to avoid that problem: 
function compare(a,b) 
    return a:gsub(" ", "0") < b:gsub(" ", "0") 
-- If 'compare' is not used (table.sort(buf)) 
-- Lua uses implicit for sorting (see Lua tutorial): 
-- return a < b 
-- so changing the provided return statement to this above 
-- would be enough to restore sorting to how it was before 
end 

function SortSelectedLines() 
    local sel = editor:GetSelText() 
    if #sel == 0 then return end 
    local eol = string.match(sel, "\n$") 
    local buf = lines(sel) 
    table.sort(buf, compare) 
--table.foreach (buf, print) --used for debugging 
    local out = table.concat(buf, "\n") 
    if eol then out = out.."\n" end 
    editor:ReplaceSel(out) 
end 

-- --------- 
-- :Sort Selected Lines 
-- ----------------------------------------------------------------------------- 
関連する問題