OSDN Git Service

・presentaion : 日本語訳の追加 (odp/pdf)
[ring-lang-081/ring.git] / docs / ja-jp / source / lists.txt
1 .. index:: 
2         single: リスト; はじめに
3
4 ======
5 リスト
6 ======
7
8 この章ではリストの用法を学びます。
9
10 .. index:: 
11         pair: リスト; リストの作成
12
13 リストの作成
14 ============
15
16 角括弧の内側にリストを定義することで、新しいリストを作成できます。
17
18 用例:
19
20 .. code-block:: ring
21
22         aList = [1,2,3,4,5]
23
24 また : 演算子や、
25
26
27 用例:
28
29 .. code-block:: ring
30
31         aList = 1:5
32         aList2 = "a":"z"
33
34 用例:
35
36 .. code-block:: ring
37
38         aList = 5:1
39         aList2 = "z":"a"
40
41 list() 関数でも新しいリストを作成できます。
42
43 文法:
44
45 .. code-block:: ring
46
47         list = list(size)
48
49 用例:
50
51 .. code-block:: ring
52
53         aList = list(10)        # aList は 10 項目を有しています。
54
55 .. note:: リストのインデックスは 1 が始点となります。
56
57 .. index:: 
58         pair: リスト; リスト項目の追加
59
60 項目の追加
61 ==========
62
63 Add() 関数はリストへ新しい項目を追加します。
64
65 文法:
66
67 .. code-block:: ring
68
69         Add(List,Item)
70
71
72 用例:
73
74 .. code-block:: ring
75
76         aList = ["one","two"]
77         add(aList,"three")
78         see aList
79
80 \+ 演算子を使用することもできます。
81
82 文法:
83
84 .. code-block:: ring
85
86         リスト + 項目
87
88 用例:
89
90 .. code-block:: ring
91
92         aList = 1:10    # 1 ~ 10 までの数値を有するリストを作成します。
93         aList + 11      # リストへ数値 11 を追加
94         see aList       # リストを表示
95
96 .. index:: 
97         pair: リスト; リストのサイズ取得
98
99 リストのサイズ取得
100 ==================
101
102 len() 関数はリストのサイズを取得します。
103
104 文法:
105
106 .. code-block:: ring
107
108         Len(List)
109
110 用例:
111
112 .. code-block:: ring
113
114         aList = 1:20  see len(aList)  # 20 を表示
115
116 .. index:: 
117         pair: リスト; リスト項目の削除
118
119 リスト項目の削除
120 ================
121
122 del() 関数はリストから項目を削除します。
123
124 文法:
125
126 .. code-block:: ring
127
128         del(list,index)
129
130 用例:
131
132 .. code-block:: ring
133
134         aList = ["one","two","other","three"]
135         Del(aList,3)    # 3 番目の項目を削除
136         see aList       # one two three を表示
137
138
139 .. index:: 
140         pair: リスト; リスト項目の取得
141         
142 リスト項目の取得
143 ================
144
145 リストから項目を取得するには、この文法を使用します。
146
147 .. code-block:: ring
148
149         List[Index]
150
151 用例:
152
153 .. code-block:: ring
154
155         aList = ["Cairo","Riyadh"]
156         see "Egypt : " + aList[1] + nl +
157             "KSA   : " + aList[2] + nl
158
159 .. index:: 
160         pair: リスト; リスト項目への代入
161
162 リスト項目への代入
163 ==================
164
165 リストの項目へ値を代入するには、この文法を使用します。
166
167 .. code-block:: ring
168
169         List[Index] = Expression
170
171 用例:
172
173 .. code-block:: ring
174
175         aList = list(3) # 三項目を有するリストを作成します。
176         aList[1] = "one" aList[2] = "two" aList[3] = "three"
177         see aList
178
179 .. index:: 
180         pair: リスト; 検索
181
182 検索
183 ====
184
185 Find() 関数はリスト内の項目を検索します。
186
187 文法:
188
189 .. code-block:: ring
190
191         Find(List,ItemValue)                    ---> 項目のインデックス
192         Find(List,ItemValue,nColumn)            ---> nColumn を検索して項目のインデックスを返します。
193         Find(List,ItemValue,nColumn,cAttribute) ---> 項目のインデックス
194
195 用例:
196
197 .. code-block:: ring
198
199         aList = ["one","two","three","four","five"]
200         see find(aList,"three")         # 3 を表示
201
202 用例:
203
204 .. code-block:: ring
205
206         mylist = [["one",1],
207                   ["two",2],
208                   ["three",3]]
209
210         see find(mylist,"two",1) + nl           # 2 を表示
211         see find(mylist,2,2) + nl               # 2 を表示
212
213 また binarysearch() 関数は整列されたリストを検索します。
214
215 文法:
216
217 .. code-block:: ring
218
219         BinarySearch(List,ItemValue)         ---> 項目のインデックス
220         BinarySearch(List,ItemValue,nColumn) ---> nColumn を検索して項目のインデックスを返します。
221
222 用例:
223
224 .. code-block:: ring
225
226         aList = ["one","two","three","four","five"]
227         aList = sort(aList)
228         see binarysearch(aList,"three")
229
230 実行結果:
231
232 .. code-block:: ring
233
234         five
235         four
236         one
237         three
238         two
239         4
240
241 .. index:: 
242         pair: リスト; 整列
243
244 整列
245 ====
246
247 Sort() 関数はリストを整列します。
248
249 文法:
250
251 .. code-block:: ring
252
253         Sort(List)                    ---> 整列されたリスト
254         Sort(List,nColumn)            ---> nColumn に基づいて整理されたリスト
255         Sort(List,nColumn,cAttribute) ---> 属性に基づいて整列されたリスト
256
257 用例:
258
259 .. code-block:: ring
260
261         aList = [10,12,3,5,31,15]
262         aList = sort(aList) see aList # 3 5 10 12 15 31 を表示
263
264 文字列の整列もできます。
265
266 用例:
267
268 .. code-block:: ring
269
270         mylist = ["mahmoud","samir","ahmed","ibrahim","mohammed"]
271         see mylist                # 整列前のリストを表示
272         mylist = sort(mylist)     # リストの整列
273         see "list after sort"+nl
274         see mylist                # ahmed ibrahim mahmoud mohammed samir を表示
275
276 特定の列に基づいてリストを整列できます。
277
278 用例:
279
280 .. code-block:: ring
281
282         aList = [ ["mahmoud",15000] ,
283                   ["ahmed", 14000 ] ,
284                   ["samir", 16000 ] ,
285                   ["mohammed", 12000 ] ,
286                   ["ibrahim",11000 ] ]
287
288         aList2 = sort(aList,1)
289         see aList2
290
291 実行結果:
292
293 .. code-block:: ring
294
295         ahmed
296         14000
297         ibrahim
298         11000
299         mahmoud
300         15000
301         mohammed
302         12000
303         samir
304         16000
305
306
307 .. index:: 
308         pair: リスト; 反転
309
310 反転
311 ====
312
313 Reverse() 関数はリストを反転します。
314
315 文法:
316
317 .. code-block:: ring
318
319         Reverse(List) ---> 反転されたリスト
320
321 用例:
322
323 .. code-block:: ring
324
325         aList = [10,20,30,40,50]
326         aList = reverse(aList)
327         see aList       # 50 40 30 20 10 を表示
328
329 .. index:: 
330         pair: リスト; リスト項目の挿入
331
332 リスト項目の挿入
333 ================
334
335 Insert() 関数はリストへ項目を挿入します。
336
337 文法:
338
339 .. code-block:: ring
340
341         Insert(List,Index,Item)
342
343 **\インデックスの後**\ に項目を挿入します。
344
345 用例:
346
347 .. code-block:: ring
348
349         aList = ["A","B","D","E"]
350         insert(aList,2,"C")    # インデックス 2 の後に位置 3 へ "C" を挿入します。
351         see aList              # A B C D E を表示
352
353
354 また、 insert(aList, 0 ,Value) で **\リストの先頭位置 (最初)**\に項目を挿入します
355
356 .. code-block:: ring
357
358         aList = 1:5
359         insert(aList,0,0)  // リスト、先頭位置 (0)、挿入する項目のデータ
360         See aList # 0 ~ 5 までの数値を表示します。
361
362
363 .. index:: 
364         pair: リスト; 入れ子リスト
365
366 入れ子リスト
367 ============
368
369 リストは他のリストを有しています。
370
371 用例:
372
373 .. code-block:: ring
374
375         aList = [ 1 , [10,20,30] , 5 , [100,1000,5000] ]
376         aList2 = [
377         "one","two", 
378         [3,4],
379         [20,30], ["three",
380                   "four",
381                   "five",[100,200,300]
382                  ]
383         ]
384         
385         see aList[2]            # 10 20 30 を表示
386         see aList[4][3] + nl    # 5000 を表示
387         see aList2[5][2] + nl   # four を表示
388         see aList2[5][4][3]     # 300 を表示
389
390 .. index:: 
391         pair: リスト; リストのコピー
392
393 リストのコピー
394 ==============
395
396 代入演算子はリスト (入れ子リストも含む) をコピーします。
397
398 用例:
399
400 .. code-block:: ring
401
402         aList = [
403         "one","two", 
404         [3,4],
405         [20,30], ["three",
406                   "four",
407                   "five",[100,200,300]
408                  ]
409         ]
410
411         aList2 = aList          # aList から aList2 へコピー
412         aList2[5] = "other"     # 項目番号 five を変更
413         see aList2[5] + nl      # other を表示
414         see aList[5]            # three four five 100 200 300 を表示
415
416
417 .. index:: 
418         pair: リスト; 第一級リスト
419
420 第一級リスト
421 ============
422
423 リストは `第一級オブジェクト <https://ja.wikipedia.org/wiki/第一級オブジェクト>`_ であるため、リストへ変数を格納したり、関数へリストを渡したり、さらに関数からリストを返せます。
424
425 用例:
426
427 .. code-block:: ring
428
429         aList = duplicate( [1,2,3,4,5] )
430         see aList[10] + nl                # 5 を表示
431
432         see mylist()                      # 10 20 30 40 50 を表示
433         
434         func duplicate list
435                 nMax = len(list)
436                 for x = 1 to nMax
437                         list + list[x]
438                 next
439                 return list
440
441         func mylist return [10,20,30,40,50]
442
443 .. index:: 
444         pair: リスト; リストを定義時に使用するには
445                 
446 リストを定義時に使用するには
447 ============================
448
449 初回にリストを定義するときに、リスト項目を使用します。
450
451 用例:
452
453 .. code-block:: ring
454
455         aList = [ [1,2,3,4,5] , aList[1] , aList[1] ]
456         see aList       # 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 を表示
457         
458         
459 .. index:: 
460         pair: リスト; リストを関数へ渡すには
461
462 リストを関数へ渡すには
463 ======================
464
465 リストは参照渡しにより関数へ渡されるため、呼び出された関数側でリストの処理や変更ができます。
466
467 用例:
468
469 .. code-block:: ring
470
471         func main
472                 aList = [1,2,3,4,5]     # Main 関数内でローカルなリストを作成します。
473                 myfunc(aList)           # リストを参照渡しにすることで、関数を呼び出します。
474                 see aList               # 1 2 3 4 5 6 7 8 9 10 を表示します。
475
476         func myfunc list
477                 list + [6,7,8,9,10]
478
479
480 .. index:: 
481         pair: リスト; 文字列インデックスによるリストへのアクセス
482
483 文字列インデックスによるリストへのアクセス
484 ==========================================
485
486 項目のインデックスを数値で決定することで、項目の値の設定または項目を取得できますが、
487 二つの項目を有するリストであり、かつ最初の項目が文字列から構成されている項目ならば、
488 文字列インデックスで項目へアクセスできます。
489
490 用例:
491
492 .. code-block:: ring
493
494         aList = [ ["one",1] , ["two",2] , ["three",3] ]
495         see aList["one"] + nl +
496             aList["two"] + nl +
497             aList["three"]      # 1 2 3 の表示
498
499 この種類のリストは演算子 : および = で定義したほうがより優れたシンタックスになります。
500
501 用例:
502
503 .. code-block:: ring
504
505         aList = [ :one = 1 , :two = 2 , :three = 3 ]
506         see aList["one"] + nl +
507             aList["two"] + nl +
508             aList["three"] + nl # 1 2 3 の表示
509         see aList[1]            # one 1 表示
510
511 .. tip:: 識別子 (単語) の先頭に : (コロン) を付けるとリテラルとして扱われます。
512
513 .. note:: = で二つの項目を有するリストを定義すると最初の項目は左辺となり、
514         次の項目は右辺となるリストを作成します。
515
516 文字列インデックスでリストへ新しい項目を追加できます。
517
518 用例:
519
520 .. code-block:: ring
521         
522         aList = []
523         aList["Egypt"] = "Cairo"
524         aList["KSA"] = "Riyadh"
525         see aList["Egypt"] + nl +       # Cairo を表示
526         aList["KSA"] + nl               # Riyadh を表示
527
528 .. index:: 
529         pair: リスト; リストによる仮引数または実引数の渡しかた
530
531 リストによる仮引数または実引数の渡しかた
532 ========================================
533
534 この種類のリストでは、仮引数の順序は重要ではないため、 
535 関数へ渡すための仮引数としては非常に優れています (順序の変更ができます)。
536
537 仮引数は、オプション扱いの場合があります。
538
539 用例:
540
541 .. code-block:: ring
542
543         myconnect (  [ :server = "myserver.com" , :port = 80 , 
544                        :username = "mahmoud" , :password = "password" ] ) 
545
546         func myconnect mypara
547         
548                 # 接続の詳細を表示
549                 see "User Name : " + mypara[:username] + nl +
550                     "Password  : " + mypara[:password] + nl +
551                     "Server    : " + mypara[:server] + nl +
552                     "Port      : " + mypara[:port]
553 .. index:: 
554         pair: リスト; リスト配列による仮引数または実引数の渡しかた
555
556 リスト配列による仮引数または実引数の渡しかた
557 ============================================
558
559 配列形式により、関数へ仮引数また実引数を渡します。
560
561 用例:
562
563 .. code-block:: ring
564
565      myList = [5,7,3,9]    ### 配列は実引数または仮引数のリストです。
566      result = sum(myList)
567      See "Sum result: "+ result +n
568
569      func sum(aList)
570        acc = 0
571        sizeList = len(aList)
572    
573        for i = 1 to sizeList
574           See aList[i] +nl
575           acc = acc + aList[i]
576        next
577      return acc
578  
579
580 .. index:: 
581         リスト: リストまたはハッシュテーブルを引数として返すには
582
583 リストまたはハッシュテーブルを引数として返すには
584 ================================================
585         
586 関数から配列またはハッシュ形式で引数を返します。
587
588 用例:
589
590 .. code-block:: ring
591
592         sudoku = [  [2,9,0],
593                     [0,0,1],
594                     [0,0,0] ]
595
596         aOutput = myFunctionArray(sudoku)
597                 See "Return Array: T/F: "+ aOutput[1] +" Row: "+ aOutput[2] +" Col: "+ aOutput[3] +nl
598
599         aOutput = myFunctionHash(sudoku)
600                 See "Return Hash.: T/F: "+ aOutput[:lValue] +" Row: "+ aOutput[:nRow] +" Col: "+ aOutput[:nCol] +nl
601
602         ###--------------------------------
603         ### isSolvedSoduku - 配列を返します
604
605         Func myFunctionArray(sudoku)
606             for Row = 1 to 9
607                 for Col = 1 to 9
608                     if sudoku[Row][Col] = 0
609
610                         //-----------------------------
611                         // 三要素から成る配列を返します
612                         return [False, Row, Col]                    
613                     ok
614                 next
615             next
616         return [True, Row, Col]
617
618         ###------------------------------------
619         ### isSolvedSoduku - ハッシュを返します
620
621         Func myFunctionHash(sudoku)
622             for Row = 1 to 3
623                 for Col = 1 to 3
624                     if sudoku[Row][Col] = 0
625
626                         //-----------------------------------------
627                         // 三要素から成るハッシュテーブルを返します
628                         return  [   :lValue = False, 
629                                     :nRow   = Row, 
630                                     :nCol   = Col   
631                                 ]
632                     ok
633                 next
634             next
635
636         return  [ :lValue = False, :nRow = Row, :nCol = Col ]           
637
638         ###-----------------------------
639
640 .. index:: 
641         pair: リスト; リストと再帰による多次元配列の作成方法
642
643 リストと再帰による多次元配列の作成方法
644 ======================================
645         
646 指定の大きさによる多次元配列でも関数の再帰で作成できます。
647
648 用例:
649
650 .. code-block:: ring
651
652         ###---------------------------------------------------------------------------------
653         ### 配列の作成 -- 指定の大きさの次元:  三次元、四次元、五次元など
654
655         dimList = [4,3,4]
656         bList   = createDimList(dimList)
657         
658         ###---------------------------------------------------------------------------------
659         ### 1 のカウンタを使用して配列へ代入 ,  4x4x4 = 256 , 2x3x4x5x6 = 720
660
661         Counter = 1
662
663         for Col=1 to dimList[1]
664           for Row=1 to dimList[2]
665             for Dep=1 to dimList[3]
666                     blist[Col][Row][Dep] = Counter
667                     Counter++
668             next
669           next
670         next
671
672         ###---------------------------------------------------------------------------------
673         ### ブロック形式で配列の要素を表示します。
674
675         for Col=1 to dimList[1]
676           for Row=1 to dimList[2]
677             for Dep=1 to dimList[3]
678                     See bList[Col][Row][Dep] See " "
679             next
680             See nl
681           next
682             See nl
683         next
684
685         ###=================================================================================
686         ### 関数
687
688         ###---------------------------------------------------------------------------------
689         ### 次元をもつ配列を再帰的に作成します。
690         ### 配列の次元を渡すことで呼び出します: dimList = [2,3,4,5]
691         ### 最初のエントリーで全ての反復呼び出しの降下を行い newParms を作成します。
692         ###
693         ### 用例:
694         ###    dimList = [4,2,3,2]                <<< 配列形式による次元の大きさと数値です。
695         ###    bList   = createDimList(dimList)   <<< 入力からの配列を使用して呼び出します。
696
697         func createDimList(dimArray)
698
699              sizeList = len(dimArray)
700
701              newParms = []
702              for i = 2 to sizeList
703                 Add(newParms, dimArray[i])
704              next
705
706              alist = list(dimArray[1])
707
708              if sizeList = 1
709                 return aList
710              ok
711
712              for t in alist
713                  t = createDimList(newParms)
714              next
715
716         return alist
717         
718      
719 .. index:: 
720         pair: リスト; 項目の交換
721
722 項目の交換
723 ==========
724
725 Swap() 関数はリスト項目を交換します。
726
727 用例:
728
729 .. code-block:: ring
730
731         aList = [:one,:two,:four,:three]
732         see aList
733         see copy("*",50) + nl
734         swap(aList,3,4)
735         see aList
736
737 実行結果:
738
739 .. code-block:: ring
740
741         one
742         two
743         four
744         three
745         **************************************************
746         one
747         two
748         three
749         four
750
751