ラーニングビッグデータ:Javaベース編の配列

7965 ワード

Javaベース-配列配列配列は、複数の変数を保存および管理するための言語の基本要素です.たとえば、3人の学生の成績を統計する場合は、3つの変数a、b、cを手動で定義し、3つの変数の値を出力する場合は、3つの出力文を書くこともできます.しかし、1学年のすべての学生の成績を管理するには、100人以上の学生がいる可能性があります.学生ごとに手動で変数を定義すると、プログラムには100以上の変数があります.また、すべての学生の成績を出力するには、100以上の出力文があります.このようなコードは非常に複雑で煩雑であることは明らかです.
そのため、複数のデータを比較的容易に管理できる方法が必要です.この場合、配列を使用する必要があります.
一、配列の基本操作配列:複数の同タイプの変数を一度に定義する.
配列空間はメモリ内で必ず連続している.
1、配列の作成
int[]aまたはint a[]は、intタイプを定義する1次元配列変数aを表す
a=new int[3]; 長さ3 intのメモリ領域が割り当てられていることを示します
int[]a=new int[3]; また、intタイプの1次元配列を定義し、長さ3 intのメモリ空間を同時に割り当てることを示す2つの部分を1つに書くこともできます.
2、下付き
配列を定義することは、複数の同じタイプの変数を一度に定義することです.配列にスペースを割り当てると、配列を使用できます.配列を使用する場合は、配列要素を下付きで表す必要があります.例えば、長さが3つのintタイプの変数が割り当てられており、この3つのint変数は、それぞれ、a[0]、a[1]、a[2]で表すことができる.
すなわち、長さnの配列が割り当てられると、配列の下付き範囲は0~n−1となる.
a[0] = 10;//配列要素の割り当て
a[1] = 20;
a[2] = 30;
3、配列を巡る
遍歴配列:一定の順序で、各要素を一度アクセスし、漏れず、繰り返しません.
サンプルコード:
package p5;
public class TestArray{
    public static void main(String [] args){
        int[]a;//      int []a; int a [];
        a=new int[3];//     a,       ,       
        a[0]=1;
        a[1]=2;
        a[2]=3;//     
        for(int i=0;i<3;i++){//    
        System.out.println(a[i]);
        }
    }
}

4,配列の初期化
配列要素は、割り当てなしで使用できます.配列要素には特定のデフォルト値があります.
byte、short、int、longの4つの整数タイプで、デフォルト値は0です.
floatとdoubleの2つの小数点タイプで、デフォルトは0.0です.
booleanのデフォルト値はfalseです
charのデフォルト値も0です
なお、charタイプの0は、文字「0」ではなく、0の符号化を指す.
オブジェクトタイプの配列のデフォルト値はnullです.
初期化の表示
1つ目の形式は次のとおりです.
int[] a = {10, 20, 30};
配列変数を定義しながらしか使用できないのが特徴です.
2つ目の構文は次のとおりです.
int[] a = new int[]{10, 20, 30};
なお、この構文では、newキーワードの後ろの角カッコには数字がありません.つまり、明示的な初期化では配列の長さを規定することはできません.配列の長さは後ろの要素の個数によって決まります.
package p5;
public class TestArray{
    public static void main(String [] args){
        int[]a;//      int []a; int a [];
        a=new int[3];//     a,       ,       
        a[0]=1;
        a[1]=2;
        a[2]=3;//     
        /*
        int[]a={1,2,3};//        ,              
        //int []a=new int [](1,2,3);
        //int []a=new int [3](1,2,3); error!!!
        */
        for(int i=0;i<3;i++){//    
        System.out.println(a[i]);
        }
    }
}

二、配列のメモリにおける表示Java配列のメモリにおける表示状況.次の2行のコードを見てください
int[] a;
  a = new int[3];
コードと結びつけて、メモリ内の配列の表現を分析します.
最初の行では、配列変数aが定義され、連続するメモリ領域が割り当てられません.
2行目は、まずnew int[3]を実行し、このコードは1セグメント連続のメモリ空間を割り当て、合計3つのintを入れることができるため、12バイトである.この12バイトの各バイトには独自のメモリアドレスがあり、そのうち、12バイトの最初のバイトは、このメモリの「ヘッダアドレス」と呼ばれています.ヘッダアドレスが1 a 2 bであると仮定する.第3ステップではnew int[3]を実行した後,付与を行った.いったい何を変数aに付与したのか.ただし、割り当てはメモリのヘッダアドレスです.すなわち、配列変数は、配列内のヘッダアドレス1 a 2 bを保持する.下図のように
 
三、二次元配列1、二次元配列の基本操作二次元配列および多次元配列:配列の配列.
例えば、私たちの日常生活の引き出しは、複数のものを保管するために使われていると考えられています.そのため、引き出しは1つのものの配列です.1つのロッカーには、複数の引き出しを格納することができるので、ロッカーは引き出しからなる配列であると理解することができる.したがって、ロッカーは「配列の配列」と理解することができ、すなわち、ロッカーの要素は引き出しであり、引き出し自体は配列である.
I,二次元配列の作成
int[][] a; またはint[]a[];またはint a[];;
2 D配列変数を定義する場合、同じように配列空間が割り当てられません.
 
a = new int[3][4];
2 D配列にメモリ領域を割り当て、3行4列の2 D配列を割り当てます.
私たちが割り当てたこの2次元配列は1つのロッカーに相当し、このロッカーは3階建てで、各階に引き出しを置いています.この引き出しの中は4つの格子に分かれていて、各格子にはまた1つの要素を入れることができます.2 D配列は「配列の配列」であるため、2 D配列の「行」は、この2 D配列にいくつかの要素が含まれていることを意味します.2 D配列の要素は1 D配列であるため、行、すなわち2 D配列にはいくつかの1 D配列が含まれています.カラムとは、2 D配列の各1 D配列に、それぞれいくつかの要素が含まれていることを意味します.
 
a[0][2]
0行2列目を表す要素
int [][]a={{1,2,3}{5,6,7}{8,9,10}{11,12,13}};
2 D配列の表示初期化
II,2 D配列を巡る
2 D配列を巡回する場合は、行と列の2つの数値を取得します.
まず、2次元配列にはa.lengthのような変数があり、a.lengthを用いて得られる長さは、2次元配列要素の個数、すなわち行の数であり、戸棚の引き出しの個数と理解される.列の数は、1 a 2 b a・・・1 a 2 b 7次元配列の長さに相当し、引き出しの大きさとしても理解できる.i番目の引き出しについては、a[i]を使用することができる.lengthはその長さを得る.
サンプルコード:
package p5;
public class TestArray2{
    public static void main(String [] args){
        //int [][]a=new int[4][3];//         ,            ,
        //             
        // int [][]a=new int [][3];//error!!!
        int [][]a={{1,2,3},{5,6,7},{8,9,10},{11,12,13}};//          
        for(int i=0;i

2,2 D配列のメモリ表示
 
a配列にとっては、1次元配列であり、この1次元配列の長さは3であり、すなわち、a配列には3つの要素がある.一方、a[0],a[1],a[2]は、それぞれ1次元配列のアドレスを記録している.そこで,a配列を「一次元配列の一次元配列」,すなわち二次元配列と呼ぶ.
3,不規則配列
Javaは、通常の2次元配列に加えて、不規則配列もサポートします.例えば、1つのロッカーに3つの引き出しがある場合、この3つの引き出しのうち、必ずしも各引き出しが同じ大きさを持っているとは限らず、3番目の引き出しがより大きく、要素がより多く、1番目の引き出しは相対的に小さい可能性があります.
int[][] a;//配列変数の定義
a = new int[3][];//まず最初の次元を確定し、ロッカーに引き出しが3つあることを示しますa=new int[][3];//error!
a[0] = new int[3];//上層部の引き出しには3つの要素があります
a[1] = new int[4];//次のレイヤには4つの要素があります
a[2] = new int[5];//最下層には5つの要素があります
 
四、配列の一般的なアルゴリズム1、配列の拡張はまず、配列空間が割り当てが完了すると、長さは変更できません.したがって,既存の配列の空間の後ろに直接新しいメモリ空間を追加することはできない.配列の長さを増やすには、次の方法を使用します.
①、新しい配列を割り当て、新しい配列の長さは元の配列より大きい(例えば、長さは元の配列の2倍)
②、既存の配列のデータを、新しい配列にコピーする.
 
package p5;
import java.util.Arrays;
public class TestArrayExpand{
    public static void main(String []args){
    int []a={1,2,3,4};//    a,      a
    int []b=new int[8];//    b,  b      ,
    a=expand(a);
    }
    public static int[] expand(int[]a){//    1
        int []b=new int[a.length*2];
        for(int i=0;i

2,泡の順序付けは順序付けの過程の中で、隣接する元素は絶えず比較して交換します.交換の過程で、大きな要素は配列の末尾に沈み、小さな要素は配列の先頭に向かう.これは水の中にあるようです.重いものは沈んで、軽いものは浮かび上がっています.このソート方式は水の中の気泡が浮上する過程に似ているだけに、このソート方式はバブルソートと呼ばれている.
次に、バブルソートのコードを書きます.5つの要素がある場合は4回のループが必要であり,すなわち配列の長さがa.lengthであればa.length-1回のループが必要である.したがって、外層サイクルは以下のようになる.
for(int i = 0; i…}
内層サイクルはやや複雑です.内層サイクルのサイクル変数をjとすると,比較するたびにa[j]とa[j+1]の2つの要素が比較される.ではjのサイクル条件はどう書きますか?
1回目のループでは、iの値は0であり、最後に並ぶため、j+1の最大値はa.length、jの最大値はa.length-1である. 
2回目のサイクルでは、iの値は1であり、j+1の最大値はa.length-1であり、jの最大値はa.length-2である.
3回目のサイクルでは、iの値は2であり、j+1の最大値はa.length-2であり、jの最大値はa.length-3である.
以上から,サイクルj+1の最大値は,毎回a.length−iであることが分かった.jの最大値はa.length-i-1である.従って、内層サイクル条件は以下の通りである.
for(int i = 0; i

さらに細かく、コードは
for(int i = 0; i a[j+1]){ 
                    a[j]  a[j+1]   
            } 
        } 
    }

2つの変数の値をどのように交換しますか?2つの変数a=5があると仮定します.b=4;2つのaとbの値を交換するには、どうすればいいですか?
a=bを直接実行すると、aの値5はbの値で上書きされます.このように,aにはbの値があるが,bにはa変数の元の値が得られない.したがって,2つの変数の値を交換するためには,3番目の変数が関与する必要がある.
まず、新しい変数tを定義する.そして、aの値をt:t=aに割り当てる.
次に、bの値をa:a=bに付与する.これによりa元の値が上書きされますが、大丈夫です.a元の値はt変数に保存されます.
次に,t変数に保存されている既存のa変数の値をbに与える.
サンプルコード:
package p5;
public class TestArraySort{
    public static void main(String[]args){
        int []data={5,4,2,1,3};//        ,        
        int n=data.length;//    n     ,          
        for(int i=1;idata[j+1]){
                int t=data[j];
                data[j]=data[j+1];
                data[j+1]=t;//data[j] data[j+1]    
                }

            }   

        }

        for(int i=0;i

3,選択ソート選択ソートは単純で直感的なソートアルゴリズムである.その動作原理は、並べ替えられるデータ要素の中から最小(または最大)の要素を選択するたびに、並べ替えられるデータ要素がすべて並ぶまでシーケンスの開始位置に格納することです.選択ソートは不安定なソート方法である(例えばシーケンス[5,5,3]は最初に1つ目[5]と[3]を交換し、1つ目の5が2つ目の5の後ろに移動する)
package p5;
public class TestArraySort{
    public static void main(String[]args){
        int []data={5,4,2,1,3};//        ,        
        int n=data.length;//    n     ,          
        for(int i=0;idata[j]){
                    int t=data[i];
                    data[i]=data[j];
                    data[j]=t;
                }
            }

        }

        for(int i=0;i