.. index:: single: リスト; はじめに ====== リスト ====== この章ではリストの用法を学びます。 .. index:: pair: リスト; リストの作成 リストの作成 ============ 角括弧の内側にリストを定義することで、新しいリストを作成できます。 用例: .. code-block:: ring aList = [1,2,3,4,5] また : 演算子や、 用例: .. code-block:: ring aList = 1:5 aList2 = "a":"z" 用例: .. code-block:: ring aList = 5:1 aList2 = "z":"a" list() 関数でも新しいリストを作成できます。 文法: .. code-block:: ring list = list(size) 用例: .. code-block:: ring aList = list(10) # aList は 10 項目を有しています。 .. note:: リストのインデックスは 1 が始点となります。 .. index:: pair: リスト; リスト項目の追加 項目の追加 ========== Add() 関数はリストへ新しい項目を追加します。 文法: .. code-block:: ring Add(List,Item) 用例: .. code-block:: ring aList = ["one","two"] add(aList,"three") see aList \+ 演算子を使用することもできます。 文法: .. code-block:: ring リスト + 項目 用例: .. code-block:: ring aList = 1:10 # 1 ~ 10 までの数値を有するリストを作成します。 aList + 11 # リストへ数値 11 を追加 see aList # リストを表示 .. index:: pair: リスト; リストのサイズ取得 リストのサイズ取得 ================== len() 関数はリストのサイズを取得します。 文法: .. code-block:: ring Len(List) 用例: .. code-block:: ring aList = 1:20 see len(aList) # 20 を表示 .. index:: pair: リスト; リスト項目の削除 リスト項目の削除 ================ del() 関数はリストから項目を削除します。 文法: .. code-block:: ring del(list,index) 用例: .. code-block:: ring aList = ["one","two","other","three"] Del(aList,3) # 3 番目の項目を削除 see aList # one two three を表示 .. index:: pair: リスト; リスト項目の取得 リスト項目の取得 ================ リストから項目を取得するには、この文法を使用します。 .. code-block:: ring List[Index] 用例: .. code-block:: ring aList = ["Cairo","Riyadh"] see "Egypt : " + aList[1] + nl + "KSA : " + aList[2] + nl .. index:: pair: リスト; リスト項目への代入 リスト項目への代入 ================== リストの項目へ値を代入するには、この文法を使用します。 .. code-block:: ring List[Index] = Expression 用例: .. code-block:: ring aList = list(3) # 三項目を有するリストを作成します。 aList[1] = "one" aList[2] = "two" aList[3] = "three" see aList .. index:: pair: リスト; 検索 検索 ==== Find() 関数はリスト内の項目を検索します。 文法: .. code-block:: ring Find(List,ItemValue) ---> 項目のインデックス Find(List,ItemValue,nColumn) ---> nColumn を検索して項目のインデックスを返します。 Find(List,ItemValue,nColumn,cAttribute) ---> 項目のインデックス 用例: .. code-block:: ring aList = ["one","two","three","four","five"] see find(aList,"three") # 3 を表示 用例: .. code-block:: ring mylist = [["one",1], ["two",2], ["three",3]] see find(mylist,"two",1) + nl # 2 を表示 see find(mylist,2,2) + nl # 2 を表示 また binarysearch() 関数は整列されたリストを検索します。 文法: .. code-block:: ring BinarySearch(List,ItemValue) ---> 項目のインデックス BinarySearch(List,ItemValue,nColumn) ---> nColumn を検索して項目のインデックスを返します。 用例: .. code-block:: ring aList = ["one","two","three","four","five"] aList = sort(aList) see binarysearch(aList,"three") 実行結果: .. code-block:: ring five four one three two 4 .. index:: pair: リスト; 整列 整列 ==== Sort() 関数はリストを整列します。 文法: .. code-block:: ring Sort(List) ---> 整列されたリスト Sort(List,nColumn) ---> nColumn に基づいて整理されたリスト Sort(List,nColumn,cAttribute) ---> 属性に基づいて整列されたリスト 用例: .. code-block:: ring aList = [10,12,3,5,31,15] aList = sort(aList) see aList # 3 5 10 12 15 31 を表示 文字列の整列もできます。 用例: .. code-block:: ring mylist = ["mahmoud","samir","ahmed","ibrahim","mohammed"] see mylist # 整列前のリストを表示 mylist = sort(mylist) # リストの整列 see "list after sort"+nl see mylist # ahmed ibrahim mahmoud mohammed samir を表示 特定の列に基づいてリストを整列できます。 用例: .. code-block:: ring aList = [ ["mahmoud",15000] , ["ahmed", 14000 ] , ["samir", 16000 ] , ["mohammed", 12000 ] , ["ibrahim",11000 ] ] aList2 = sort(aList,1) see aList2 実行結果: .. code-block:: ring ahmed 14000 ibrahim 11000 mahmoud 15000 mohammed 12000 samir 16000 .. index:: pair: リスト; 反転 反転 ==== Reverse() 関数はリストを反転します。 文法: .. code-block:: ring Reverse(List) ---> 反転されたリスト 用例: .. code-block:: ring aList = [10,20,30,40,50] aList = reverse(aList) see aList # 50 40 30 20 10 を表示 .. index:: pair: リスト; リスト項目の挿入 リスト項目の挿入 ================ Insert() 関数はリストへ項目を挿入します。 文法: .. code-block:: ring Insert(List,Index,Item) **\インデックスの後**\ に項目を挿入します。 用例: .. code-block:: ring aList = ["A","B","D","E"] insert(aList,2,"C") # インデックス 2 の後に位置 3 へ "C" を挿入します。 see aList # A B C D E を表示 また、 insert(aList, 0 ,Value) で **\リストの先頭位置 (最初)**\に項目を挿入します .. code-block:: ring aList = 1:5 insert(aList,0,0) // リスト、先頭位置 (0)、挿入する項目のデータ See aList # 0 ~ 5 までの数値を表示します。 .. index:: pair: リスト; 入れ子リスト 入れ子リスト ============ リストは他のリストを有しています。 用例: .. code-block:: ring aList = [ 1 , [10,20,30] , 5 , [100,1000,5000] ] aList2 = [ "one","two", [3,4], [20,30], ["three", "four", "five",[100,200,300] ] ] see aList[2] # 10 20 30 を表示 see aList[4][3] + nl # 5000 を表示 see aList2[5][2] + nl # four を表示 see aList2[5][4][3] # 300 を表示 .. index:: pair: リスト; リストのコピー リストのコピー ============== 代入演算子はリスト (入れ子リストも含む) をコピーします。 用例: .. code-block:: ring aList = [ "one","two", [3,4], [20,30], ["three", "four", "five",[100,200,300] ] ] aList2 = aList # aList から aList2 へコピー aList2[5] = "other" # 項目番号 five を変更 see aList2[5] + nl # other を表示 see aList[5] # three four five 100 200 300 を表示 .. index:: pair: リスト; 第一級リスト 第一級リスト ============ リストは `第一級オブジェクト `_ であるため、リストへ変数を格納したり、関数へリストを渡したり、さらに関数からリストを返せます。 用例: .. code-block:: ring aList = duplicate( [1,2,3,4,5] ) see aList[10] + nl # 5 を表示 see mylist() # 10 20 30 40 50 を表示 func duplicate list nMax = len(list) for x = 1 to nMax list + list[x] next return list func mylist return [10,20,30,40,50] .. index:: pair: リスト; リストを定義時に使用するには リストを定義時に使用するには ============================ 初回にリストを定義するときに、リスト項目を使用します。 用例: .. code-block:: ring aList = [ [1,2,3,4,5] , aList[1] , aList[1] ] see aList # 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 を表示 .. index:: pair: リスト; リストを関数へ渡すには リストを関数へ渡すには ====================== リストは参照渡しにより関数へ渡されるため、呼び出された関数側でリストの処理や変更ができます。 用例: .. code-block:: ring func main aList = [1,2,3,4,5] # Main 関数内でローカルなリストを作成します。 myfunc(aList) # リストを参照渡しにすることで、関数を呼び出します。 see aList # 1 2 3 4 5 6 7 8 9 10 を表示します。 func myfunc list list + [6,7,8,9,10] .. index:: pair: リスト; 文字列インデックスによるリストへのアクセス 文字列インデックスによるリストへのアクセス ========================================== 項目のインデックスを数値で決定することで、項目の値の設定または項目を取得できますが、 二つの項目を有するリストであり、かつ最初の項目が文字列から構成されている項目ならば、 文字列インデックスで項目へアクセスできます。 用例: .. code-block:: ring aList = [ ["one",1] , ["two",2] , ["three",3] ] see aList["one"] + nl + aList["two"] + nl + aList["three"] # 1 2 3 の表示 この種類のリストは演算子 : および = で定義したほうがより優れたシンタックスになります。 用例: .. code-block:: ring aList = [ :one = 1 , :two = 2 , :three = 3 ] see aList["one"] + nl + aList["two"] + nl + aList["three"] + nl # 1 2 3 の表示 see aList[1] # one 1 表示 .. tip:: 識別子 (単語) の先頭に : (コロン) を付けるとリテラルとして扱われます。 .. note:: = で二つの項目を有するリストを定義すると最初の項目は左辺となり、 次の項目は右辺となるリストを作成します。 文字列インデックスでリストへ新しい項目を追加できます。 用例: .. code-block:: ring aList = [] aList["Egypt"] = "Cairo" aList["KSA"] = "Riyadh" see aList["Egypt"] + nl + # Cairo を表示 aList["KSA"] + nl # Riyadh を表示 .. index:: pair: リスト; リストによる仮引数または実引数の渡しかた リストによる仮引数または実引数の渡しかた ======================================== この種類のリストでは、仮引数の順序は重要ではないため、 関数へ渡すための仮引数としては非常に優れています (順序の変更ができます)。 仮引数は、オプション扱いの場合があります。 用例: .. code-block:: ring myconnect ( [ :server = "myserver.com" , :port = 80 , :username = "mahmoud" , :password = "password" ] ) func myconnect mypara # 接続の詳細を表示 see "User Name : " + mypara[:username] + nl + "Password : " + mypara[:password] + nl + "Server : " + mypara[:server] + nl + "Port : " + mypara[:port] .. index:: pair: リスト; リスト配列による仮引数または実引数の渡しかた リスト配列による仮引数または実引数の渡しかた ============================================ 配列形式により、関数へ仮引数また実引数を渡します。 用例: .. code-block:: ring myList = [5,7,3,9] ### 配列は実引数または仮引数のリストです。 result = sum(myList) See "Sum result: "+ result +n func sum(aList) acc = 0 sizeList = len(aList) for i = 1 to sizeList See aList[i] +nl acc = acc + aList[i] next return acc .. index:: リスト: リストまたはハッシュテーブルを引数として返すには リストまたはハッシュテーブルを引数として返すには ================================================ 関数から配列またはハッシュ形式で引数を返します。 用例: .. code-block:: ring sudoku = [ [2,9,0], [0,0,1], [0,0,0] ] aOutput = myFunctionArray(sudoku) See "Return Array: T/F: "+ aOutput[1] +" Row: "+ aOutput[2] +" Col: "+ aOutput[3] +nl aOutput = myFunctionHash(sudoku) See "Return Hash.: T/F: "+ aOutput[:lValue] +" Row: "+ aOutput[:nRow] +" Col: "+ aOutput[:nCol] +nl ###-------------------------------- ### isSolvedSoduku - 配列を返します Func myFunctionArray(sudoku) for Row = 1 to 9 for Col = 1 to 9 if sudoku[Row][Col] = 0 //----------------------------- // 三要素から成る配列を返します return [False, Row, Col] ok next next return [True, Row, Col] ###------------------------------------ ### isSolvedSoduku - ハッシュを返します Func myFunctionHash(sudoku) for Row = 1 to 3 for Col = 1 to 3 if sudoku[Row][Col] = 0 //----------------------------------------- // 三要素から成るハッシュテーブルを返します return [ :lValue = False, :nRow = Row, :nCol = Col ] ok next next return [ :lValue = False, :nRow = Row, :nCol = Col ] ###----------------------------- .. index:: pair: リスト; リストと再帰による多次元配列の作成方法 リストと再帰による多次元配列の作成方法 ====================================== 指定の大きさによる多次元配列でも関数の再帰で作成できます。 用例: .. code-block:: ring ###--------------------------------------------------------------------------------- ### 配列の作成 -- 指定の大きさの次元: 三次元、四次元、五次元など dimList = [4,3,4] bList = createDimList(dimList) ###--------------------------------------------------------------------------------- ### 1 のカウンタを使用して配列へ代入 , 4x4x4 = 256 , 2x3x4x5x6 = 720 Counter = 1 for Col=1 to dimList[1] for Row=1 to dimList[2] for Dep=1 to dimList[3] blist[Col][Row][Dep] = Counter Counter++ next next next ###--------------------------------------------------------------------------------- ### ブロック形式で配列の要素を表示します。 for Col=1 to dimList[1] for Row=1 to dimList[2] for Dep=1 to dimList[3] See bList[Col][Row][Dep] See " " next See nl next See nl next ###================================================================================= ### 関数 ###--------------------------------------------------------------------------------- ### 次元をもつ配列を再帰的に作成します。 ### 配列の次元を渡すことで呼び出します: dimList = [2,3,4,5] ### 最初のエントリーで全ての反復呼び出しの降下を行い newParms を作成します。 ### ### 用例: ### dimList = [4,2,3,2] <<< 配列形式による次元の大きさと数値です。 ### bList = createDimList(dimList) <<< 入力からの配列を使用して呼び出します。 func createDimList(dimArray) sizeList = len(dimArray) newParms = [] for i = 2 to sizeList Add(newParms, dimArray[i]) next alist = list(dimArray[1]) if sizeList = 1 return aList ok for t in alist t = createDimList(newParms) next return alist .. index:: pair: リスト; 項目の交換 項目の交換 ========== Swap() 関数はリスト項目を交換します。 用例: .. code-block:: ring aList = [:one,:two,:four,:three] see aList see copy("*",50) + nl swap(aList,3,4) see aList 実行結果: .. code-block:: ring one two four three ************************************************** one two three four