Java 配列とArrayList
Java SE 8
配列
配列の宣言
宣言した配列の要素数は後から変えることができない。
配列には同じデータ型の値しか入れることができない。
→インタフェースや継承によって多態性をもつ場合を除く。
//要素数3のint型配列 int[] list1 = new int[3]; int[0] = 0; int[1] = 1; int[2] = 2; for(int i : list1){ System.out.println(i); } //宣言時に要素を代入する int[] list2 = {0, 1, 2, 3, 4, 5}; for(int i : list2){ System.out.println(i); }
文字列を配列に(split)
String data = "a,b,c,d,e,f"; String[] list = data.split(",");
配列を文字列に(join)
String[] list = {"a","b","c","d","e","f"}; String data = String.join(",", list);
配列の長さ(length)
String[] list = {"a","b","c","d","e","f"}; System.out.println(list.length);
2次元配列
//配列list1,list2,list3が存在するとき int[][] lists = {list1, list2, list3}; //直接記述するとき int[][] lists = {{0,1,2,3}, {4,5,6,7}, {8,9,0}}; //newで配列を作る int[][] lists = new int[3][4];//整数配列の要素の初期値は0 //for文で出力 for(int i = 0; i < lists.length; i++){ for(int j = 0; j < lists[i].length; j++){ System.out.println(lists[i][j]); } } //拡張for文で出力 for(int[] list : lists){ for(int i : list){ System.out.println(i); } }
ArrayList
ArrayListの使い方
はじめから要素数を決められない場合や、後から追加したい場合に使う。
import java.util.* //以下main文 ArrayList<String> team = new ArrayList<>(); //変数の宣言 team.add("要素0"); //要素を追加 team.add("要素1"); team.add("要素2"); for (String member : team){ //拡張for文はそのまま使える System.out.println(member); } System.out.println(team.get(1)); //要素をインデックス指定 System.out.println(team.size()); //配列の長さ team.set(1,"要素1だったもの"); //要素インデックス1を更新 team.remove(1); //要素インデックス1を削除。 //※削除するとインデックス2だった"要素2"がインデックス1にくる。
<>で囲んだ部分はジェネリクス。右辺の<>内は書く必要がない。
PHP 勉強1
基本文法
<?php //ここにプログラムを書く ?>
変数
$a = 100; $name = "名前"; $list1 = ["a", "b", "c", "d", "e"]; $list2 = array("a", "b", "c", "d", "e"); $array = [ "key1" => "value1", "key2" => "value2", "key3" => "value3", ]; unset($array["key1"]); print_r($array);
出力
echo "hello";
連結
//.で区切って文字列を連結 echo "こんにちは、".$name."さん"; //{}で囲んで変数を表示 $s = "ハロー、{$name}さん"; print_r($s);
Java メソッドとクラス
Java SE 8
メソッド
クラス内でのメソッドの定義
public static 戻り値型 メソッド名(仮引数,...){ return 戻り値; }
mainメソッドからの呼び出し
メソッド名(実引数,...);
クラス
クラスは設計図で、通常はその実態であるインスタンスをnewすることで、そのインスタンスが持つフィールドやメソッドを用いる。
フィールド
クラスには、それぞれのインスタンスがもつことのできるフィールドと呼ばれる変数を複数定義できる。
フィールドはクラス宣言の下に書く。
public class Rectangle{ //フィールド private int tate; private int yoko; }
クラスメソッド
クラスには、それぞれのインスタンスがもつことのできるクラスメソッドと呼ばれるメソッドを複数定義できる。
クラスメソッドではフィールドの値を使って計算したり、フィールドの値を出力したりすることができる。
クラスメソッドにはstaticがつかない。
public class Rectangle{ private int tate; private int yoko; //クラスメソッド public int getArea(){ return tate * yoko; } public void show(){ System.out.println("tate:"+tate+", yoko:"+yoko+", area:"+getArea()); } }
コンストラクタ
インスタンスを作成するとき、初期化処理を行う特別なメソッドであるコンストラクタが呼び出される。
ひとつもコンストラクタが書かれていない場合、コンパイラがデフォルトコンストラクタを作成する。
コンストラクタ名はクラス名と同じものを使う。
Eclipseでは、ソース、フィールドを使用してコンストラクターを生成、などで自動生成処理が行える。
コンストラクタの仮引数の型や個数を変えて複数定義しておくことで、仮引数の型や個数に応じて異なるコンストラクタを呼び出すクラスになる。
public class Rectangle{ private int tate; private int yoko; //コンストラクタ public Rectangle(){ this.tate = 5; this.yoko = 15; } public Rectangle(int tate, int yoko){ this.tate = tate; this.yoko = yoko; } public int getArea(){ return tate * yoko; } public void show(){ System.out.println("tate:"+tate+", yoko:"+yoko+", area:"+getArea()); } }
new
メインメソッドでnewすることでインスタンスを作成し、フィールドやクラスメソッドを利用できるようになる。
public static void main(String[] args){ Rectangle r = new Rectangle(10, 20); r.show(); }
newされるとコンストラクタに仮引数の10と20が渡され、ローカル変数rが参照するインスタンス自身のフィールドのtateに10、yokoに20をそれぞれ代入する。
r.tate = 100;
のように記述するとpublicなフィールドにアクセスできてしまう。それを避けるためにフィールドはprivateで定義する。
r.show();
でRectangleクラスのshowメソッドを呼び出すことができる。
show()では自身のフィールドと、getAreaメソッドを使って計算した面積の値を出力する。
getArea内で計算しているのはthis.tateとthis.yokoだが、ここはあえてthisを書かなくても動く。
コンストラクタ内では、フィールドのtateと仮引数のtateを区別するためにthisを書いている。
HAS-A関係
フィールドに別のクラスのインスタンスをもつクラスを作成することができる。
基本的に、クラスがもつフィールドは、そのクラス内で処理する。
継承
クラス作成時に「extends クラス名」を書き加えると、該当クラスのスーパークラス(親)を継承したサブクラス(子)を作ることができる。
public class NamedRectangle extends Rectangle{ //追加するフィールド String name; //コンストラクタ public NamedRectangle(String name){ super(); this.name = name; } public NamedRectangle(String name, int tate, int yoko){ super(tate, yoko); this.name = name; public static void main(String[] args){ NamedRectangle nr = new NamedRectangle("one", 10, 20); nr.show(); } }
コンストラクタでは、親のコンストラクタを呼び出せるsuper();を使用している。
子にはshowメソッドはないが、親のshowメソッドを利用することができる。
オーバーライド
親のもつメソッドと同名で異なる動作のメソッドを子に作ることができる。
public class NamedRectangle extends Rectangle{ int tate; int yoko; String name; public NamedRectangle(String name) { super(); this.name = name; } public NamedRectangle(String name, int tate, int yoko){ super(tate, yoko); this.name = name; } //ここでshowメソッドをオーバーライド @Override public void show() { System.out.println("name:"+name+", tate:"+tate+", yoko:"+yoko+", area:"+getArea()); } public static void main(String[] args) { NamedRectangle nr = new NamedRectangle("one", 10, 20); //ここで呼び出されるのは、オーバーライドされたshowメソッド nr.show(); } }
抽象クラス
クラス定義時にabstractをつけると、実際の処理を書かない抽象メソッドをもつ抽象クラスを書くことができる。
抽象クラスは継承した子クラスでコンストラクタを定義し、メソッドをオーバーライドすることでnewできるクラスになる。
抽象クラス自体をnewすることはできない。
abstract class クラス名{ abstract 戻り値型 メソッド名(仮引数,...); }
インタフェース
インタフェースは-ableという名前をつけることが多い。
インタフェースの宣言時はclassではなくinterfaceと書く。
中には抽象メソッドを書き、実際の処理は書かない。このときabstractは省略される。
public interface Lockable{ boolean lock(); boolean unlock(); }
インタフェースはクラス宣言時にimplementsで実装し、インタフェースがもつ抽象メソッドをすべてオーバーライドする。
public class Safe implements Lockable{ @Override public boolean lock(){ return true; } @Override public boolean unlock(){ return false; } public static void main(String[] args){ Safe sf = new Safe(); System.out.println(sf.lock()); System.out.println(sf.unlock()); }
上記はlock()はtrueを返し、unlock()はfalseを返すだけのプログラム。
Comparableインタフェースを実装すると指定の比較方法で比較処理を行えるクラスが作れるようになる。
参考
なぜ抽象クラス(Abstract)を実装するのか - Qiita
Java 基本文法
Java SE 8
ひな形
public class Test { public static void main(String[] args) { 処理; } }
class名は大文字から開始する。ソースファイルと同じものになる。
処理の部分にメインメソッドで実行するものを書いていく。
命令の末尾にはセミコロン「;」をつける。
eclipseでは「main」とキー入力し、ctrl+spaceでmainメソッドを短縮入力可能。
標準出力
//改行あり出力 System.out.println("hello"); //改行なし出力 System.out.print("world"); //変数の出力 String s = "文字列"; System.out.println(s);
eclipseでは「sys」とキー入力し、ctrl+spaceでprintlnメソッドを短縮入力可能。
コメント
//1行コメント /* 複数行コメント */
変数
Javaで使用できる変数には、プリミティブ型と参照型が存在する。
プリミティブ型
データ型 | 値 |
boolean | true, false |
char | 16ビットUnicode文字 ¥u0000~¥uFFFF |
byte | 8ビット整数 -128~127 |
short | 16ビット整数 -32,768~32,767 |
int | 32ビット整数 -2,147,483,648~2,147,483,647 |
long | 64ビット整数 -9,223,372,036,854,775,808~9,223,372,036,854,775,807 |
float | 32ビット単精度浮動小数点数 |
double | 64ビット倍精度浮動小数点数 |
参照型
データ型 | 値 |
String | 文字列 |
変数宣言
//データ型 変数名 = 値; int a = 100; String s = "文字列";
final
finalをつけて宣言した変数は一度だけ代入が可能となる。変更ができないので定数のように利用できる。
//final データ型 変数名 = 値; final float PI = 3.1415F;
キャスト(型変換)
int i = 1; double d = 1.2; String s = "123"; //実数を整数型に変換 (int)d; //整数を実数型に変換 (double)i; //文字列を整数型に変換 Integer.parseInt(s); //文字列を実数型に変換 Double.parseDouble(s);
ランダム値
Mathを利用する
//x個のyから始まるランダムな値 double rand = Math.random() * x + y; int number = (int)rand; //int型にキャスト //1行で書くなら int number = (int)(Math.random() * x + y);
Randomを利用する
//x個の0から始まるランダムな値 Random rand = new Random(); int number = rand.nextInt(x);
import java.util.Random;が必要。
制御構文
if(条件分岐)
if (条件式1){ //処理①; } else if (条件式2){ //処理②; } else { //当てはまらない場合の処理③; }
switch(条件分岐)
switch (式){ case 定数1: //処理①; break; case 定数2: //処理②; berak; default: //当てはまらない場合の処理③; }
while(繰り返し)
int i = 0; while (i <= 5){ //処理; i++; }
do while(繰り返し)
1度は必ず実行し、条件式を満たしていれば繰り返し。
int i = 0; do{ //処理; i++; }while(i <= 5);
for(繰り返し)
for(int i = 0; i <= 5; i++){ //処理; }
拡張for(繰り返し)
int配列iに格納された0番目の配列から順に、すべての要素のぶんだけ繰り返す。
int[] i = {0, 1, 2, 3, 4}; for (int x : i){ //処理; }
参考
Java入門 ~Javaの開発環境を用意する手順やJavaを使ったプログラミングの方法について解説します~ | JavaDrive
演算子 | Javaコード入門
乱数を生成!JavaでRandomクラスを使う方法【初心者向け】 | TechAcademyマガジン
Java 導入
インストール
Javaの開発にはJDKとIDEが必要となる。
今回は以下を使用する。
OS : windows 64bit
JDK : SE 8
IDE : Eclipse
JDK SE 8
JDK(Java Development Kit)のダウンロード
Java SE - Downloads | Oracle Technology Network | Oracle
上記サイトのJDK Downloadで、利用しているOSのJDKを入手する。今回はJava SE 8を選択。