プログラム言語 特殊な配列・リスト

配列

多次元配列

int[,] ary = new int[2, 2];
ary[0, 0] = 1;
ary[0, 1] = 2;
ary[1, 0] = 3;
ary[1, 1] = 4;

int[,] ary = new int[,]
{
  { 1, 2 },
  { 3, 4 }
};

foreach (int elm in ary)
{
  Console.WriteLine(elm);
}

int[][] ary = new int[][]{1,2,3,4}
int[][] ary = {1,2,3,4}
int ary[][] = {1,2,3,4}

C#における、int[,] ary ~ の構文は無い。
(多次元配列とジャグ配列の宣言の違い無し)

ジャグ配列

要素が配列である配列

配列の要素として配列を格納する為には配列インスタンスを作成する必要がある。

int[][] ary = new int[3][];
ary[0] = new int[] { 1, 2, 3 };
ary[1] = new int[] { 1, 2 };
ary[2] = new int[] { 1, 2, 3, 4, 5 };

int[][] ary = new int[3][]
{
  new int[] { 1, 2, 3 },
  new int[] { 1, 2 },
  new int[] { 1, 2, 3, 4, 5 }
};

foreach (int[] elms in ary)
{
  foreach (int elm in elms)
  {
    Console.WriteLine(elms);
  }
}

配列の要素として配列を格納する為に、配列インスタンスを作成する必要無し(自動)

int[][] array = new int[2][2];
array[0][0] = 5;
array[0][1] = 5;
array[1][0] = 5;
array[1][1] = 5;
array[2][0] = 5; ⇒ 実行時エラー

宣言と同時に要素を設定
int[][] array = new int[][]
{
  {5,5},
  {5,5}
};

2次元目の要素数を定めずに宣言
int[][] array = new int[2][];
array[0] = new int[]{5,5};
array[1] = new int[]{5,5,5};
array[2] = new int[]{5,5,5,5}; ⇒ 実行時エラー

my @elm1 = ("row1-col1", "row1-col2", "row1-col3");
my @elm2 = ("row2-col1", "row2-col2", "row2-col3");
my @table = (@elm1, @elm2);
print $table[0][0] #エラー

#配列のリファレンス取得
my $ref1 = ["row1-col1", "row1-col2", "row1-col3"];
my $ref2 = ["row2-col1", "row2-col2", "row2-col3"];
my @table = ($ref1, $ref2);
print $table[0][0] # ⇒ "row1-col1"

#連想配列の中に配列を入れる

my $elm1 = {
 name => 'yone',
 age => 36,
};
my @family = ('wife', 'child1', 'child2');
my $elm2 = {
 #配列を作成と同時にのリファレンスを格納
 food => ['niku', 'sushi'],
 sports => 'basket',
 #配列のリファレンスを格納
 family => \\@family,
};
my %table = (
 elm1 => $elm1,
 elm2 => $elm2
);

print Dumper %table,"\\n";


$VAR1 = 'elm2';
$VAR2 = {
 'sports' => 'basket',
 'family' => [
  'wife',
  'child1',
  'child2'
   ],
 'food' => [
   'niku',
   'sushi'
  ]
};
$VAR3 = 'elm1';
$VAR4 = {
 'name' => 'yone',
 'age' => 36
};

ポインタ(リファレンス/デリファレンス)を使用した配列の利用については「プログラム言語 ポインタ / 配列のポインタ」参照

リスト(コレクション)

リストの型については「プログラム言語 ジェネリック」参照

List myList = new List<int> {10,20,30,40,50};
var myList = new List {10,20,30,40,50}; も可

追加
myList.Add(6);

int[] myInt = { 1, 2, 3 };
var list = new List<string>() { @"A", @"B" };
list.AddRange(myInt.Select(n => n.ToString()));
list.AddRange(Enumerable.Range(start: 4, count: 10).Select(n => n.ToString()));

結合して追加
int[] ary1 = { 1, 2, 3 };
int[] ary2 = { 4, 5, 6 };
ary1 = ary1.Concat(ary2).ToArray();

削除
myList.Remove(10);
myList.Remove(myList[3]);
myList.RemoveAt(1);

ソート
myList.Sort();

string[] ary = new string[] { "b", "aaaaa", "cc" };
Array.Sort(ary, (x, y) => x.Length.CompareTo(y.Length));
※x, y には長さを比較する為の各要素が入り、2つの要素の長さ比較を行う

DateTime[] ary = new DateTime[]
{
 new DateTime(year: 2010, month: 1, day: 1),
 new DateTime(year: 2001, month: 1, day: 1),
 new DateTime(year: 2005, month: 1, day: 1),
 new DateTime(year: 2003, month: 1, day: 1)
};
Array.Sort(ary, (x, y) => Math.Sign(x.Ticks – y.Ticks));
var newary1 = ary.OrderBy(n => n);

初期化
myList.Clear();

#include <vector>

int main(array<System::String ^> ^args)
{
  ベクター(コレクション)
  std::vector<int> myVector;
  イテレーター:位置情報
  std::vector<int>::iterator myBegin;
  std::vector<int>::iterator myEnd;
  
  myVector.push_back(10); // 末尾に追加
  myVector.push_back(20); // 末尾に追加
  myVector.push_back(30); // 末尾に追加
  myVector.pop_back(); // 末尾を削除
  
  Console::WriteLine(myVector[0]);
  Console::WriteLine(myVector.at(0));
  // → 10
  
  // 先頭要素の取得(削除はしない)
  int elm = myVector.front();
  // elm:10
  // 末尾要素の取得(削除はしない)
  int elm = myVector.back();
  // elm:30
  
  myBegin = myVector.begin();  //最初の要素位置
  myEnd = myVector.end();    //最後の要素位置
  myFunc(myBegin, myEnd);
  
  return 0;
}

void myFunc(std::vector<int>::iterator prmBegin, std::vector<int>::iterator prmEnd)
{

  // 位置情報:先頭~末尾まで全件Loop

  for (std::vector<int>::iterator tmp = prmBegin; tmp != prmEnd; tmp++)
  {
    Console::WriteLine(*tmp);
  }
  
  ↓も同じ
  
  // 位置情報:先頭~末尾まで全件Loop

  for (; prmBegin != prmEnd; ++prmBegin)
  {
    // ポインタを用いて遠隔操作
    Console::WriteLine(*prmBegin);
  }
}

Dim myList As New List(Of Integer)({10, 20, 30, 40, 50})

myList.Add(15)
myList.Remove(20)
myList.Remove(myList(2))
myList.RemoveAt(1)
myList.Sort()
myList.Clear()

IF クラス 順序 重複 追加 削除 参照
Collection List ArrayList 格納順 add remove
SortedList 整列 add remove
Set HashSet 順不同 × add remove
TreeSet 整列 × add remove
Queue ArrayDeque FIFO offer
offerLast
poll peek
Deque ArrayDeque LIFO offerFirst poll peek
Map Map HashMap 順不同 キー:×
値:〇
put remove get(キー)
TreeMap 整列 キー:×
値:〇
put remove get(キー)

import java.util.ArrayList;

ArrayList array = new ArrayList<>();
ArrayList<Object> array = new ArrayList<Object>();と同じ

array.add(5);
⇒ array {5}

array.add("5");
⇒ array {5,"5"}

array.add('5');
⇒ array {5,"5",'5'}

array.add(2,5);
⇒ array {5,"5",5,'5'}
指定の位置に追加

array.set(0, 50);
⇒ array {50,"5",5,'5'}
先頭から合致した要素を上書き

array.remove("5");
⇒ array {50,5,'5'}
先頭から合致した要素を削除

for (int i=0; i<array.size(); i++){
 String s = array.get(i);
}
for (Iterator i=array.iterator(); i.hasNext(); ){
 String s = i.next().toString();
}

ArrayList
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("2");
list.add("3");
for (String key : list){
 System.out.println(key);
}
→1 2 2 3

HashSet
HashSet<String> hashSet = new HashSet<>();
hashSet.addAll(list);
for (String key : hashSet){
 System.out.println(key);
}
→2 1 3

TreeSet
TreeSet<String> treeSet = new TreeSet<>();
treeSet .addAll(list);
for (String key : treeSet){
 System.out.println(key);
}
→1 2 3

Queue
Queue<String> queue = new ArrayDeque<>();
queue.addAll(list);
System.out.println(queue.poll());
System.out.println(queue.poll());
queue.offer("2");
System.out.println(queue.poll());
System.out.println(queue.poll());
System.out.println(queue.poll());
→1 2 2 3 2

Deque
Deque<String> stack = new ArrayDeque<>();
stack.offerFirst("1");
stack.offerFirst("2");
stack.offerFirst("2");
stack.offerFirst("3");
System.out.println(stack.poll());
System.out.println(stack.poll());
stack.offerFirst("2");
System.out.println(stack.poll());
System.out.println(stack.poll());
System.out.println(stack.poll());
→3 2 2 2 1

perl_push_pop

push
配列の最後に要素を追加する
my @x;
push(@x, 1);
my @y = (2,3);
push(@x, @y);
push(@x, 4, 5); #連続でいくつでも追加可
⇒ @x : 1 2 3 4 5

pop
配列の最後の要素を取り除く
my @before = (1,2,3,4,5);
pop(@before);
⇒ @before : 1 2 3 4

my $after = pop(@before);
⇒ $after : 4
⇒ @before : 1 2 3

shift
配列の最初の要素を取り除く
my @before = (1,2,3,4,5);
shift(@before);
⇒ @before : 2 3 4 5

my $after = shift(@before);
⇒ $after : 2
⇒ @before : 3 4 5

unshift
先頭へ要素追加
my @x;
my @y = (1,2,3);
unshift(@x, @y);
unshift(@x, 0, -1);
⇒ @x : -1 0 1 2 3

splice
配列から指定の要素を、指定の個数分取り除く
splice(配列 , 開始Index , 個数);

my @x = (1,2,3,4,5);
splice(@x,0,2);
⇒ @x : 3 4 5

reverse
配列の要素を逆順にする

my @before = (1,2,3,4,5);
my @after = reverse(@before);
⇒ @before : 1 2 3 4 5
⇒ @after : 5 4 3 2 1

sort
配列の要素をソートする(数値限定)

my @before = (2,1,4,3,5);

昇順
my @after = sort{$a <=> $b}(@before);
⇒ @before : 2,1,4,3,5
⇒ @after : 1 2 3 4 5

降順
my @after = sort{$b <=> $a}(@before);
⇒ @before : 2,1,4,3,5
⇒ @after : 5 4 3 2 1

比較

Comparable Comparator
機能 自身と他者との大小比較 2オブジェクトの大小比較
Package java.lang.Comparable java.util.Comparator
メソッド compareTo ・compare
・equals
・reversed
クラス ・Integer
・String等
・TreeSet
・TreeMap等

package java.lang;
public interface Comparable<T> {
 public int compareTo(T o);
}


public final class Integer extends Number implements Comparable<Integer> {
 public int compareTo(Integer anotherInteger) {
  return compare(this.value, anotherInteger.value);
 }
 public static int compare(int x, int y) {
  return (x < y) ? -1 : ((x == y) ? 0 : 1);
 }

}

package java.util;
public interface Comparator<T> {
 int compare(T o1, T o2);
 boolean equals(Object obj);
 default Comparator<T> reversed() {
  return Collections.reverseOrder(this);
 }
}

並び替え(自然順序)

自然順序:数字、アルファベット順等

List<String> list = new ArrayList<>();
list.add("20");
list.add("30");
list.add("10");
list:20 30 10

Collections.sort(list);
list:10 20 30

Collections.reverse(list);
list:30 20 10

並び替え(定義)

public class Employee{
 private String _name;
 private Integer _id;
 public Employee(String name, Integer id){
  this._name = name;
  this._id = id;
 }
 public Integer getId(){
  return this._id;
 }
 public String getName(){
  return this._name;
 }
}

※Integer.class
public int compareTo(Integer anotherInteger) {
 return compare(this.value, anotherInteger.value);
}
public static int compare(int x, int y) {
 return (x < y) ? -1 : ((x == y) ? 0 : 1);
}

import java.util.Comparator;

public class MyRule implements Comparator<Employee>{
 public int compare(Employee obj1, Employee obj2){
  return obj1.getId().compareTo(obj2.getId());
 }
}

※java.util.Collections.class
public class Collections {
 public static void sort(List list1) {
  list1.sort(null);
 }
 public static void sort(List list1, Comparator comparator) {
  list1.sort(comparator);
 }
}

public class StudyMain {

 public static void main(String[] args) {
  Employee e1 = new Employee("JavaScript", 20);
  Employee e2 = new Employee("php", 25);
  Employee e3 = new Employee("Java", 10);

  List<Employee> list = new ArrayList<>();
  list.add(e1);
  list.add(e2);
  list.add(e3);
  System.out.println("ArrayListの格納順");
  print(list);
  →20 JavaScript 25 php 10 Java

  System.out.println("MyRole.ID順");
  Collections.sort(list, new MyRule());
  print(list);
  →10 Java 20 JavaScript 25 php
 }

 private static void print(List<Employee> list){
  for (Employee obj : list){
   System.out.println(obj.getId() + " " + obj.getName());
  }
 }
}

連想配列(ハッシュ、ディクショナリ、マップ)

Dictionary<string, string> dic = new Dictionary<int, string>();
dic.Add(1, @"西宮");
dic.Add(2, @"神戸");
dic.Add(3, @"芦屋");

Dictionary<string, string> myDic = new Dictionary<string, string>
{
  {"1Top","大久保"},
  {"左Wing","香川"},
  {"右Wing","岡崎"},
  {"Top下","本田"}
};

foreach (var element in myDic){
  string pos = element.Key;
  string name = element.Value;
};

foreach (string myKey in myDic.Keys)
{
  string pos = myKey;
  string name = myDic[pos];
};

string ret;
myDic.TryGetValue(key: 3, value: out ret);
key:3が無ければnullが返る

ポインタ(リファレンス/デリファレンス)を使用した配列の利用については「プログラム言語 ポインタ / 連想配列(ハッシュ)のポインタ」参照

自動整列リスト
SortedList<int, string> mySorted = new SortedList<int, string>
{
  {11,"大久保"},
  {10,"香川"},
  {9,"岡崎"},
  {4,"本田"}
};

HashMap
Map<String, String> hashMap = new HashMap<String, String>();
hashMap.put("B", "Java");
hashMap.put("C", "php");
hashMap.put("A", "JavaScript");
for (Map.Entry<String, String> entry : hashMap.entrySet()){
 System.out.println(entry);
}
→B=Java C=php A=JavaScript

TreeMap
Map<String, String> treeMap = new TreeMap<String, String>();
treeMap.put("B", "Java");
treeMap.put("C", "php");
treeMap.put("A", "JavaScript");
for (Map.Entry<String, String> entry : treeMap.entrySet()){
 System.out.println(entry);
}
→A=JavaScript B=Java C=php

マップの初期化(イニシャライザ)
public static final HashMap<String, String> pg = new HashMap<>();
static {
 pg.put("01", "Java");
 pg.put("02", "C#");
 pg.put("03", "php");
 pg.put("04", "JavaScript");
}

マップの初期化(匿名関数)
※lassファイルが2つできてしまう為非推奨
public static final HashMap<String, String> pg = new HashMap<String, String>(){
 {
  put("01", "Java");
  put("02", "C#");
  put("03", "php");
  put("04", "JavaScript");
 }
};

マップのLoop
for (int i=1; i<=map.size(); i++){
 String k = String.format("%02d", i);
 String s = map.get(k);
}
for (String key : map.keySet()){
 String k = key;
}
for (String value : map.values()){
 String v = value;
}
for (Map.Entry<String, String> entry : map.entrySet()){
 String k = entry.getKey();
 String v = entry.getValue();
}

Dim myDic As New Dictionary(Of String, String)() From { _
  {“key1”, “value1”}, _
  {“key3”, “value3”}, _
  {“key2”, “value2”}, _
  {“key4”, “value4”}
}

For Each element In myDic
  Dim key = element.Key
  Dim value As String = element.Value
Next element

For Each element As String In myDic.Keys
  Dim key As String = element
  Dim value As String = myDic(key)
Next element

自動整列リスト
Dim mySorted As New SortedList(Of String, String)() From { _
  {"key1", "value1"}, _
  {"key3", "value3"}, _
  {"key2", "value2"}, _
  {"key4", "value4"}
}

my %profile;
$profile{"name"} = "yone"
$profile{"age"} = 35

print "$profile{'name'}\\n";
⇒yone

ハッシュへの一括代入
my %profile = (
  'name' => 'yone',
  'age' => 35
);
又は
my %profile = ("name","yone","age",35)

keys
※連想配列からキーを取得
my $key = keys(%profile);

for my $key ( keys(%profile) ){
  $keyにはkeyだけが入る
}

values
※連想配列から値を取得
my $value = values(%profile);

for my $value ( values(%ary) ){
  $valueにはvalueだけが入る
}

delete
※連想配列から指定のキーを削除
delete($profile{"age"});

追加
$profile{新key} = ~;

exists
if ( exists($profile{キー}) ) {
  ~
}

ハッシュxを全件Loop。キー⇒name、値⇒valueへ格納。
while ( (my $name, my $value) = each(%x)){
  print "$name = $value";
}
※name,value の変数名は変更可能

①var変数 = new Object;
※変数[キー] = 値;

var TestArray = new Object();

TestArray["key1"] = value1;
TestArray["key2"] = value2;
TestArray["key3"] = function(){ alert("value3です。"); };

alert(TestArray["key1"]);
var strfunc = "key2"
alert(TestArray[strfunc]);

for (var i = 1; i <= 3; ++i) {
  alert["key" + i];
}

②var変数 = {キー:値 , キー:値, ・・・}

var TestArray = {
  key1:value1,
  key2:value2,
  key3:function(){ alert("value3です。");}
}

$list = [
 'php' => 'CakePHP',
 'java' => 'SpringBoot',
 'JavaScript' => 'node.js',
];

print $list['php'];
→'CakePHP'

配列・リスト変換

List<string> oldList = new List<string>() { "A", "B", "C" };

string[] array = oldList.ToArray();
array[0]:"A" / array[1]:"B" / array[2]:"C"

int[] ary = Enumerable.Range(start: 1, count: 26).ToArray();
int[] ary = Enumerable.Repeat(element: -1, count: 100).ToArray();

List<string> newList = array.ToList();
newList.AddRange(array); も可

String[] ary = {"Java", "php", "JavaSrcipt"};
List<String> list = Arrays.asList(ary);
→Java php JavaScript

list.set(2, "C#");
→Java php C#
list.remove(2); →実行時エラー(変換時はサイズ固定)

IEnumerableインターフェイス

配列、コレクションにforeach()構文でアクセスする為のインターフェイス。
IEnumerableインターフェイスはGetEnumerator()メソッドを実装しており、
これを実行するとIEnumrableインターフェイスを返す。
配列、リストは最初からのこのインターフェイスを継承している。

int[] myArray = new int[] { 1,3,5,7 };

//配列myArrayはIEnumerableを継承しているので、GetEnumerator()を実行できる。
//IEnumerableインターフェイスを返すのでmyEに格納できる
IEnumerator myE = myArray.GetEnumerator();
while(myE.MoveNext())
{
  int val = (int)myE.Current;
  Console.WriteLine(val);
  ⇒ 1 3 5 7
}

// IEnumerableを継承いれば↓ の様に書ける
foreach(int n in myArray)
{
  Console.WriteLine(n);
  ⇒ 1 3 5 7
}

// リストも同様にIEnumerableを継承しているのでforeach()構文の使用が可能
ArrayList myList = new ArrayList() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
foreach(int i in myList)
{
  Console.WriteLine(i);
  ⇒ 1 2 3 4 5 6 7 8 9 10
}

IEnumerableインターフェイス継承クラスの自作」参照

コメントを残す

メールアドレスが公開されることはありません。