Category: Java

14-2.Random

2. Random 
Mathクラスには擬似乱数を発生させるrandomメソッドがあったが、それをもう少し高機能にしたものが、このRandomクラスである。 

import java.util.Random 

コンストラクタ
Random() 
新しい乱数ジェネレータを作成する
Random(long seed)
 long型のシードを使って乱数ジェネレータを作成する
メソッド
protected int next(int bits)

次の擬似乱数を生成する

void nextBytes(byte[] bytes)

ランダムバイトを生成し、ユーザ指定のバイト配列に配置する

double nextDouble()

乱数ジェネレータのシーケンスを使って、0.0〜1.0の範囲で一様分布のdouble型の擬似乱数を返す

float nextFloat()

乱数ジェネレータのシーケンスを使って、0.0〜1.0の範囲で一様分布のfloat型の擬似乱数を返す

double nextGaussian()

乱数ジェネレータのシーケンスを使って、平均0.0、標準偏差1.0のガウス(「正規」)分布のdouble型の擬似乱数を返す

int nextInt()

乱数ジェネレータのシーケンスを使って、一様分布のint型の擬似乱数を返す

int nextInt(int n)

乱数ジェネレータのシーケンスを使って、0から指定された値の範囲(0は含むが、その指定された値は含まない) で一様分布の int 型の擬似乱数を返す

long nextLong()

乱数ジェネレータのシーケンスを使って、一様分布のlong型の次の擬似乱数を返す

void setSeed(long seed)

単一のlong型のシードを使って、乱数ジェネレータのシードを設定す

   
sample) MathクラスのrandomメソッドとRandomクラスを用いた場合の例
import java.io.*;
import java.util.*;

class Test {
    public static void main(Stirng args[ ]) {
         for ( int i = 0 ; i < 10 ; i++ )
                 System.out.println( i + ":" + Math.random( ));

         System.out.println( );

         Random rnd new Random( );
       for( int i = 0 ; i < 10 ; i++ )
            System.out.println( i +":" + rnd.nextDouble( ) );
       }
}

C:\Java\>java Test
0:0.9490168285406363
1:0.1315265909356933
2:0.8805518855113684
3:0.022296367930474403
4:0.9159107068525388
5:0.45377169510241844
6:0.1521866646374057
7:0.2681536733194758
8:0.5647590024766241
9:0.5428563464748609

0:0.9448960819203688
1:0.93056882849094
2:0.11423327297311248
3:0.007178140412706258
4:0.945599389167783
5:0.40711585241316184
6:0.7639053958760349
7:0.19925106572398155
8:0.6933292289366854
9:0.35117261168665725

C:\Java\>

1.Javaの基礎

1章 Javaの基礎

1.Javaの基礎
■コンパイル・実行方法
Test.java

import java.io.*;

class Test{
      public static void main(String args[ ]){
           System.out.println("Hello Java World.");)
      }
}

C:\>Java>javac Test.java

C:\>Java>java Test
Hello Java World.

 
2.予約語
 自分で作る変数や関数などの名前を「識別子」とよぶ。プログラマーが自由に命名。ただし、制約がある。
  ・半角英数字および半角アンダーバー(_)のみ使用可。最初の一文字は英字。
  ・大文字、小文字は区別。
  ・下記の予約誤は使用不可。
予約語
abstract boolean break byte cast catch char
class const continue default do double else
extends final false finally float for goto
if implements import instanceof int interface long
native new package private protected public return
short static super switch synchronized this throw
throws transient true try void vlatile while
 ・クラス名は大文字ではじめる。 
 ・メソッドは、変数は小文字ではじめる。単語のつながりで表現し、2単語目以降の単語の初めは大文字にする。
例)
 class MyClass{
 int lengthOfLine;
 int getLength(){
     return lengthOfLine;
 }
}
 
※メソッド=機能ごと(ひとまとめ) ⇒ アンダーライン 、イタリック=クラス名
Test.java
 
import java.io.*;
 
//コメント
class Test{
    public static void main(String args[ ]) {
            System.out.println("Hello Java World.");
   }
}
 
 緑   : コメント
水色  : 予約語 
グレー  : JDKで用意されているクラス
 
3.構成
 
      ■ 一次式 ・ 識別子 ・・・・・・・・・・・・・・・ x
                         ・ 定数 ・・・・・・・・・・・・・・・・・ 30
                   ・ 文字列 ・・・・・・・・・・・・・・・ "this is a pen"
                         ・ メソッド ・・・・・・・・・・・・・・ func( )
                       ・ (演算式) ・・・・・・・・・・・・ ( x + 10 )
                       ・ 一次式(式の並び) ・・・・・ max( x,10 )
                     ・ 一次式[ 式 ] ・・・・・・・・・・ array[i]
                       ・ 一次式.識別子 ・・・・・・・・ struc.x
        
      ■ 式、演算子 式 ・・・・・・・・・・・・・・・・・・ x + y + 5
 ・1文の終わりを示す記号「;」
   ・1行の中に文が2つ以上あってもよい。コンパイラは1文を1文として認識する。
※下記の左右のプログラムは同じもの。
import java.io.*;

class Test{
    public static void main(String args[ ]) {
                  int x = 10;
                  int y = 20;
                  int z = x + y;
   }
}

import java.io.*;

class Test{
public static void main(String args[ ]) {
int x = 10;    int y = 20;       int z = x + y;
}}

ブロック
 文をブロックを表す「 { 」と「 } 」で囲む。ブロックは「一文とみなす単位」
 条件分岐(「if」、「else」)や反復(「for」「while」・・・)などは、基本的に一文しかじっこうできない。それだと不便だから、ブロックで一文とみなすことで複数の文を反復する事ができる。
 JavaはC++と同様オブジェクト指向言語である。オブジェクト指向とは、プログラムも実世界に存在するモノと考えてプログラムすること。このモノをクラスといい、データとメソッドから作られる。例えば、オブジェクト指向言語で"お絵かきソフト”を作ろうとしたとき、ペンクラスを用意し、ペンクラスには「絵を書く」というメソッドなどを用意する。
 Javaではパッケージという機能をつかう。JDKで用意されているクラスのうち、GUIを担うクラス群(ボタンやテキストエリア)は「awk」という名前でパッケージ化されている。ネットワーク関係を担うクラス群は「net」という名前でパッケージ化してある。さらに、パッケージの中にパッケージを入れることもできるので、たくさんのクラスを作った場合、整理するのがC++に比べ便利である。
 また、Javaはどのパッケージを使用するかをあらかじめ宣言しなくてはならない。
 下記の例は、javaパッケージのioパッケージの中の全てのクラスを使用できるというimport宣言である。
 (*が全てのクラスを使用するという意味)
Test.java

import java.io.*;
  
//コメント
class Test{ 
  public static void main(String args[ ]) {
       System.out.printin("Helo Java World.");
    }
}   

 Javaでは全てのプログラムはクラス内に収められる。
 クラス内に最初に実行されるべきmainメソッドを定義する。Javaでは、戻り値はvoid、引数はString型の配列と決まっている。
 基本的に1つのファイルに1クラス。クラス名とファイル名は同じ。
 
 
4.データの型と宣言
 変数を使う場合には宣言をしなくてはならない。データの型、名前、初期値を宣言する。Javaでは全て符号付。
Javaの型
  データの種類 バイト長 数値の範囲  
真or偽 boolean   true or false
整数 byte 1 -128~+127
1文字 char 2 -32768~+32767
整数 short 2 -32768~+32767
整数 int 4 -2147483648~+2147483647
整数 long 8 -263~263-1
小数 float 4 仮数部232、指数部28
小数 double 8 仮数部252、指数部211
1文字を表す「char」型は、16bit(2byte)に拡張されている。Javaが世界中の言語で使用できるように、例えば漢字も1文字で表すことができるようunicodeと呼ばれる文字コードに拡張されている。
int      a;                //変数名「a」をint型で宣言
char   ch1,ch2;     //変数名「ch1」と「ch2」をchar型で宣言
long  l;        //変数名「l
」をunsigned long型で宣言
変数の宣言を行っただけでは、変数にどんな値が入っているかわからない。宣言後、代入もなしに使用するとエラーとなる。
 
5.定数と変数
整数定数
 ・10進数      100    255    -50
 ・16進数      0x64   0xFF
 ・8進数       0144  0377
 ・文字        ’d’   ’あ’
小数定数
 円周率を表すには「3.1415」「0.31415E1」、「31415E-5」
 小数は標準でdouble型になるから、float型として扱いたい場合は数字の後に「f or F」をつくる。
代入
   int a. b;          // 変数名「a」 「b」をint型で宣言
   char ch1,ch2;  // 変数名「ch1」と「ch2」をchar型で宣言
   long l;       // 変数名「l」をlong型で宣言
   float f;      // 変数名「f」をfloat型で宣言
 
   ch1 = 'A';
   ch2 = '0x4C';    // 16進数で4Chを代入
   l = 'C';             // long型 l に'C'のASCl lコード4Chを代入
//  f = 3.1415;       // エラー!!
    f = 3.1415f;      // fを最後に付ける
    a = b = 100;   // aとbに100を代入
初期化
int a = 100;
char ch = 'あ';
int b = a = 5;    // aもbも5になる
int n = m = 100;   // このような使い方はダメ!! 
import java.io.*;
  
class Test{  
  public static void main(String args[ ]) {
        int a;
        int b = a;   // どんな値が入っているかわからないaでbを初期化することはできない
  }
}  
C:\java\>javac Test.java  
Test.java:6: Variable a may not have been initialized.  
                    int b = a;
                                 ^      
1 error 
 
6.簡単な演算
演算は式と式を演算子でつなぐ。
代入演算子
 コピー演算子ともいう。変数に定数を代入したりする場合に用いる。「=」を用いる。
「char」型の変数の値を「int」型に代入する場合のように、大きい変数に小さい変数を代入する場合はない。しかし、逆に「int」型の変数の値を「char」型の変数に代入する場合、エラーが出る。
  int    n1, n2, n3;
  char  c1, c2, c3;

  c1 = 100;
  n1 = c1;                // 代入先が型の方が大きいので問題なし

  n2 = 100;
  c2 = n2;                // エラー:小さい型には代入できない
  c2 = (char)n2;   // 明示的なキャスト/FONT>

算術演算子
 「+」(加算)、「-」(減算)、「*」(乗算)、「/」(除算)、「%」(余り) 
比較演算子
 「==」(等値)、「=!」(非等値)、「>」「>=」「<=」「<」(大小関係) 

 成り立つ場合は「真」すなわちtrue、成り立たない場合は「偽」すなわちfalseとなる。  int  n = 100;
 比較の「==」と代入の「=」は別物。
  int  n1 = 100;
  int  n2 = 200;
  int  n3;

  n3 = (n1 == n2);             // エラー:型が異なる
  n3 = (int)(n1==n2);         // エラー:キャストしてもだめ
  boolean  b = (n1==n2);    // これはOK

論理演算子 
 真と偽を論理演算で評価
  演算子 使用例 意味  
&& a && b AND(かつ)  
|| a || b OR(または)  
! !b NOT(否定)  
  int n1 = 100;
  int n2 = 200;
  int n3 = 10;

  boolean b = (n1==n2) && (n1==n3); // n1,n2,n3がすべて同じ時、bはtrueになる

これら論理演算子は、trueかfalseを演算しますので、boolean型の物しか演算できません。以下はエラー。
  int n1 = 100;
  int n2 = 200;
  int n3 = 10;

  boolean b1 = n1 && n2;    //エラー
  boolean b2 = !n2;            //エラー

 
7.ディスプレイへの表示
結果をDOS窓上に表示させることはアプリケーションとしても行いますし、現在の変数の値を表示させて、デバッグ作業の一環としてもやる。
DOS窓への文字の表示は下記のように行う。ここでは、決り文句だと覚える。
import java.io.*;
  
class Test{
       public static void main (String args[ ]) {
            System.out.print("abcdef");
            System.out.print("0123");
      }
} 
C:\java>javac *.java
  
C:\java>java Test
abcdef0123
C:\java>
「System.out.print」の引数に、文字列を渡してやる。改行はしないから、「abcdef」と「0123」は1行に表示される。
改行する場合は、「\n」を入れる。
import java.io.*;
  
class Test{
       public static void main (String args[ ]) {
            System.out.print("abcdef\n");
            System.out.print("0123\n");
      }
} 
C:\java>javac *.java
  
C:\java>java Test
abcdef
0123

C:\java>

一番最後に改行を入れる場合は、「\n」と書かなくても「println」メソッドを使うと改行される。
import java.io.*;
  
class Test{
       public static void main (String args[ ]) {
            System.out.println("abcdef");
            System.out.println("0123");
      }
} 
C:\java>javac *.java
 
C:\java>java Test
abcdef
0123

C:\java>

DOS窓には「標準出力」と「標準出力エラー」がある。標準出力は、MS-DOSのリダイレクト機能を使うとファイルに落としたりすることができる。標準エラー出力では、リダイレクト機能は、使えない。
「System.out.print」は、標準出力に出力する。標準出力エラーに表示したい場合は「System.err.printin」とする。
import java.io.*;
  
class Test{
       public static void main (String args[ ]) {
            System.out.println("abcdef");
            System.err.println("0123");
      }
} 
C:\java>javac *.java
 
C:\java>java Test > a.txt          ←リダイレクト機能 :標準出力をファイルに標準エラー出力の未表示される
0123

C:\java>type a.txt                   ←出力したファイルを表示 標準出力のみがファイルに落ちた
abcdef                                      標準出力のみがファイルに落ちた

C:\java>

printメソッドは、文字列だけでなく、数字も表示することができる。また、数字や文字列を「+」演算子でつなげることもできる。 
class Test{
       public static void main (String args[ ]) {
      int n1 = 100;
            System.out.println("n1=" + n1 +  "です");
      }
} 
C:\java>javac *.java
 
C:\java>java Test
n1=100です

C:\java>

 
8.文字列
import java.io.*;

class Test{
       public static void main (String args[ ]) {
           int          n               = 1;
            String str1                = "モーニング娘。の中で" + n +  "番目にかわいいのは";

            String strMyouji         = "後藤";
            String strNamae         = "真紀";
           String strName           = strMyouji + strNamae;
            System .out.println(str1 + strName + "だと思います");
   }
} 

C:\java>javac *.java
 
C:\java>java Test
モーニング娘。の中で1番目にかわいいのは後藤真紀だと思います

C:\java>

  エスケープシーケンス 機能  
  \n 改行(次の行の先頭に行く)  
  \t 水平タブ  
  \\ 円記号「\」(機種・OSによってはバックスラッシュ)  
  \' シングルクォーテーション「'」  
  \" ダブルクォーテーション「"」  
  \b 1文字戻る  
  \r  その行の先頭に戻る  
  \uxxxx xxxxは4行のUnicodeを表す  
import java.io.*;

class Test{
       public static void main (String args[ ]) {
           int          n               = 1;
            System .out.println
("私の\t名前は\"Mike Davis\"\nです。");
   }
} 

C:\java>javac *.java
 
C:\java>java Test
私の   名前は"Mike Davis"
です。

C:\java>

 

3.配列

3章 配列
1.配列とは
 例えば100個のデータが合った場合、これを変数a1,a1,a3・・・a100と設定したのでは大変だから、メモリー上に100個の連続した領域を確保し、何件ものデータを総括的に扱うことのできる方法を配列という。
 配列の添え字は、0からはじまるプログラム言語と、1から始まるプログラムがある。Javaは0からはじまる。COBOLは1。Javaは、配列を入れるための変数を宣言し配列の領域を確保し、確保した領域を宣言した変数に入れるという操作をしなければならない。領域を確保する際はどのくらいの大きさの配列かを指定しなければならないが、配列を入れるための変数を宣言する際にはどのくらいの大きさかは宣言しなくても構わない。
 
2.配列の宣言と初期化
Javaでは、配列を使用する場合に配列の最後を越えてアクセスしていないかどうかをチェックしています。つまり10個の要素しかない配列の11番目にアクセスすることはできない。(例外をスローする)
import  java.io.*;

class Test{
    public static void main(String args[ ]){
        
int a[ ] ;
         a =
new int [10];

         // 要素数が10の配列の11番目にアクセスしようとした 
    // 添え字が0から始まるので、11番目は10になる
    System.out.println(a[10]);
     }
}

C:\java>javac Test.java                                       ← コンパイルは正常 

C:\java>java Test
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException at Test.main(Test.java:9)
                                                                       ↑ 実行時にエラーが出る
C:\java>

配列の領域を確保するのと同時に、初期化を行うこともできる。
  int raikyaku[ ] = { 1,2,3,4,5 } ;

この場合、配列の大きさは、初期化の際の要素数になる。つまり、上記の例では要素数が5つの配列になる。

実際の配列領域を入れるための変数があるという事は、配列領域を別の変数に代入することもできる。
import java.io.*; 

class Test{
    
public static void main (String args[ ]){
         
int a[ ] = {  1,2,3,4,5 } ;
          int b[ ] ;

          b = a ;

          System.out.println(b[3]);

          a[3] = 100;

          System.out.println(b[3]);
    }
}

C:\java>javac Test.java

C:\java>java Test
4
100

C:\java>

Javaでは変数を用いて配列の領域確保を行うことができる。すなわち、動的に配列のサイズを変化させることができる。
import java.io.*;

class Test{
    public static void main(String args[ ]) {
         int i = 200;
         int a[ ] = new int [i];
    }
}

 
3.配列の使用法 
 配列は添え字を用いることで、その要素の読み書きをする。添え字は変数であっても構わない。
 「int型」の要素数10個の配列を作り、これに1から10の数字を代入する例
// 添え字に変数を使わない例
import  java.io.*;

class Test{
      public static void main (String args[ ]) {
           int a[ ] = new int [10];

           a[0] = 1;
           a[0] = 2;
           a[0] = 3;
           a[0] = 4;
           a[0] = 5;
           a[0] = 6;
           a[0] = 7;
           a[0] = 8;
           a[0] = 9;
           a[0] = 10;
     }
}

// 添え字に変数を使った例
import  java.io.*; 
 
class Test{ 
    public static void main(String args[ ]){
        int a[ ] = new int [10];
       int i;         // 添え字
 
   for( i = 0 ; i < 10 ; i++ )
           a[i] = i+1;
  }
}

  
[配列の変数.length]とすることで、配列の大きさを取得できる。
import  java.io.*; 
 
class Test{ 
    public static void main(String args[ ]) {
        int a[ ] = new int [10];
       int i;         // 添え字
 
   for( i = 0 ; i < a.length ; i++ )
           a[i] = i+1;
  }
}

  
配列のコピー
import  java.io.*; 
 
class Test{ 
    public static void main(String args[ ]){
        int a[ ] = { 5,4,3,2,1 };
        int b[ ] = { 1,2,3,4,5 };

         // 配列の表示
    showArray(a);
    showArray(b);

         // 配列のコピー
         // 配列aの10番目からa.length個(すべて)を配列bの0番目へとコピーする
    System.arraycopy(a, 0, b, 0, a.length); 
 
         // 配列の表示 
    showArray(a);
    showArray(b);
   }
 
   // 配列を表示するメソッド 
    public static void showArray(  int a[ ] ){
    for( int i = 0 ; i < a.length ; i++ ) 
        System.out.print(i+":"+a[i]+"\t");
   System.out.println("");
   }
}

  

C:\java>javac Test.java

C:\java>java Test
0:5     1:4     2:3     3:2      4:1  ←コピー前のa
0:1     1:2     2:3     3:4      4:5  ←コピー前のb
0:5     1:4     2:3     3:2      4:1  ←コピー前のa
0:5     1:4     2:3     3:2      4:1  ←コピー前のb(コピーされている)

C:\java>

 
5.2次元配列と多次元配列
 2次元配列とは、配列の配列である。イメージ的には表。1次元配列と同様に、配列を入れるための変数を宣言し、配列領域を確保して変数に代入するとういう手続きが必要になる。
  int a[ ][ ];                           // 2次元配列をいれるための変数
  a = new int[3][4];                // 3行4列の2次元配列領域を確保

  a[0][0] = 10;
  a[0][1] = 20;
  a[1][2] = 30;
  a[2][3] = 40;

  int a[ ][ ] = new int[3][4];     // 変数宣言と領域確保を同時にしてもよい

  a[0][0] = 10;
  a[0][1] = 20;
  a[1][2] = 30;
  a[2][3] = 40;
 

10 20 ? ?  
? ? 30 ?
? ? ? 40
    int a[ ][ ] = { { 0, 1, 2, 3 } , { 4, 5, 6, 7 } , { 8, 9, 10, 11 }  };
    int b[ ][ ] = { { 0            } , { 4, 5,       } , { 8, 9, 10, 11 }  };
    int c[ ][ ] = { { 0, 1, 2, 3 } , { 4, 5, 6, 7 } , {                  }  };
 
配列a(3行4列)   配列b(3行)   配列c(3行)  
0 1 2 3 0 X X X 0 1 2 3 X = 存在しない領域
4 5 6 7 4 5 X X 4 5 6 7
8 9 10 11 8 9 10 11 X X X X