[JAVA]整理アレイ(Array)-(2)


🏃‍♂️ 入る前に...
この投稿は学習中に作成され、javaの定式-基礎教材を学習し整理する文章です.
※学習ページ:〔Tob Master:Java〕
*教材の目次順と構成内容に基づいて作成する.
欠落している可能性のあるコンテンツは、他の検索で埋め込まれます.
配列部分を整理してみると、膨大な数になっていました.
意外にも二つの文章に分かれている.
(整列整理参照)
※2次元配列
今回は単なる並びではありません.
私たちが前に見た1次元アレイではありません.
2 Dまたは多次元アレイの場合、
ちょっと聞きに行きましょう.
レベルではメモリ容量に制限はありません...
主に1 Dおよび2 Dアレイを使用します.
まず、2 D配列について説明します.
◇宣言
宣言の仕方は簡単だ.
1 Dアレイの宣言方法と同じです.
かっこ[]を追加するだけです.

  • [타입[][] 변수이름 ;]形式

  • [타입 변수이름 [][];]形式

  • [타입[] 변수이름[] ;]形式
  • 上記の3つの形式で宣言することができます.
    2 D配列複写
    主にテーブルデータを含めるために使用されます.
    上記の形式では
    最初の[]は、テーブルデータの行(row)値です.
    2番目の[]は、テーブルデータのカラム値です.
    int[][] score = new int[4][3] ; // 4행 3열의 2차원 배열
    もちろん、この例はintタイプの配列です.
    既定値は0です.
    索引
    索引:
    上記のように
    行と列の概念でアクセスできます.
    範囲はもちろんです.
    0から始まります.
    終了値は[配列ごとの長さ]-1です.
    int[][] score = new int[4][3] // 4행 3열의 2차원 배열
    
    score[0][0] = 100 ; // 2차원 배열 score의 1행 1열값을 100으로
    System.out.println(score[0][0]) // 100 출력 (1행 1열 값)
    ◇初期化
    初期化
    私たちが以前知っていた1次元アレイの場合と似ています.{}内には{}があればよい.
    (さらに、省略new intと省略不可のコード構成条件も同じである.)
    int[][] arr = new int[][]{ {1, 2, 3} , {4, 5, 6} };
    int[][] arr = { {1, 2, 3} , {4, 5, 6} }; //생략이 가능하며
    // 선언과 동시에 생성 하지 않는 이상 생략 불가능하다는 것도 동일하다.
    
    /*
    필수나 오류 발생은 아니지만
    가독성과 이해가 쉬우려면 아래 형식과 같이 작성하는 것이 좋다.
    */
    int[][] arr = {
    		{1, 2, 3}, // 1행
            	{4, 5, 6}  // 2행
                  };
    ここでちょっと待ってください.
    急に好奇心がわいた.
    2 D配列の場合、長さ.lengthはどのように出力されますか?
    まず、行と列の数の異なる配列を作成し、出力します.
    public static void main(String[] args) {
            int[][] score = {
                    {100, 100, 100},
                    {70, 80, 90},
                    {65, 85, 93},
                    {100, 75, 60}
            };
            int tsum = 0; // 배열 내 모든 값의 합
            int rsum = 0; // 각 행의 합을 나타내기 위한 변수
    
            for (int i = 0; i < score.length; i++) { // (2차원배열).length = 행(row) 수 -> 4회 반복
                for (int k = 0; k < score[i].length; k++) { // (2차원배열)[( row index) ].length = 열(column) 수 -> 3회 반복
                    System.out.printf("score[%d][%d] (%d행 %d열) = %d %n", i,k, i+1, k+1, score[i][k]) ;
                    rsum += score[i][k];
                    tsum += score[i][k];
                }
                System.out.printf("score[%d] (%d행) 합 = %d %n", i, i+1, rsum);
                rsum = 0; // 행마다 0으로 초기화
                System.out.println(); // 행 정보 출력마다 빈 줄 간격
            }
            System.out.println("배열 내 총 합 = "+tsum) ;
        }
        
    score[0][0] (11) = 100 
    score[0][1] (12) = 100 
    score[0][2] (13) = 100 
    score[0] (1)= 300 
    
    score[1][0] (21) = 70 
    score[1][1] (22) = 80 
    score[1][2] (23) = 90 
    score[1] (2)= 240 
    
    score[2][0] (31) = 65 
    score[2][1] (32) = 85 
    score[2][2] (33) = 93 
    score[2] (3)= 243 
    
    score[3][0] (41) = 100 
    score[3][1] (42) = 75 
    score[3][2] (43) = 60 
    score[3] (4)= 235 
    
    배열 내 총 합 = 1018
    2 D配列参照関数の.length:行(行)数
    内部構成1 Dアレイの.length:カラム数
    |{利用}例によって
    使い方を知っておく.
    ①合計&平均
    public static void main(String[] args) {
            int[][] score = { // 5행 3열 Table형 2차원 배열 생성
                    {100, 100, 100},
                    {70, 80, 90},
                    {65, 85, 93},
                    {100, 75, 60},
                    {50, 50, 50}
            };
            int korSum = 0, engSum = 0, mathSum = 0 ;
    
            System.out.println("번호  국어  영어  수학  총점  평균");
            System.out.println("==============================");
    
            for (int i = 0; i < score.length; i++){
                int sum = 0; // 개인별(행별) 총점
                float avg = 0.0f; // 개인별(행별) 평균
    
                korSum += score[i][0] ;
                engSum += score[i][1] ;
                mathSum += score[i][2] ;
                System.out.printf("%3d", i+1) ; // 순번(행번호) _ 3으로 길이 지정 -> 남는 공간 공백 만들어 출력
    
                for (int k = 0; k < score[i].length; k++) {
                    sum += score[i][k]; // 행별 총점 변수에 각 배열의 각 값들을 누적합
                    System.out.printf("%5d", score[i][k]); // 각 값들을 출력 _ %n은 빼서 이어붙여 출력 (%5 길이 지정)
                }
                avg = sum/(float)score[i].length;
                System.out.printf("%5d %5.1f %n", sum, avg); // 각 값 대상 for문 마치고 총합 평균 출력
            }
            System.out.println("==============================");
            System.out.printf("총점 : %3d %4d %4d %n", korSum, engSum, mathSum) ;
        }
     
    
    
    번호  국어  영어  수학  총점  평균
    ==============================
      1  100  100  100  300 100.0 
      2   70   80   90  240  80.0 
      3   65   85   93  243  81.0 
      4  100   75   60  235  78.3 
      5   50   50   50  150  50.0 
    ==============================
    총점 : 385  390  393 
    以前に試した出力コードを再適用します.
    平均に出力されました.
    出力をよりきれいにします.
    ②String文字列2 D配列
    public static void main(String[] args) {
    	// 앞서 살펴보았던 정수 2차원 배열과 사용하는 방법은 동일하다
            String[][] words = {
                    {"chair", "의자"},
                    {"bed", "침대"},
                    {"book", "책"},
                    {"integer", "정수"}
            };
    
            Scanner scanner = new Scanner(System.in) ; // 질문응답 형식 프로그램
    
            for (int i = 0; i < words.length; i++) {
                System.out.printf("질문%d . %s의 뜻은?", i+1, words[i][0]) ; // .printf()를 활용해 %s로 문자열 출력
    
                String tmp = scanner.nextLine(); // 입력받기
    
                if (tmp.equals(words[i][1])) {
                    System.out.printf("정답! %n%n") ; // 한 줄 공백 간격을 위해 한 번 더
                }else{
                    System.out.printf("오답! (정답 : %s) %n%n",words[i][1]);
                }
            }
        }
        
    질문1 . chair의 뜻은?의자
    정답! 
    
    질문2 . bed의 뜻은?의자
    오답! (정답 : 침대) 
    
    질문3 . book의 뜻은?책
    정답! 
    
    질문4 . integer의 뜻은?실수
    오답! (정답 : 정수) 
    🔨 『Arrays Class』の簡単な理解
    ①比較&出力-equals()toString()前の1次元レイアウトを整理するときにも使用したことがあります..toString()メソッドは、値を文字列として配列形式で1行出力することができる.
    ただし、1次元配列でのみ使用できます.
    (.toString()2次元配列.ver=deepToString():すべての要素に再帰的にアクセスするため、次元制限X)
    int[] arr1 = {1, 2, 3} ;
    int[][] arr2 = { {1, 2, 3} , {4, 5, 6} };
    
    System.out.println(Arrays.toString(arr1)); // [1, 2, 3]
    System.out.println(Arrays.deepToString(arr2)); //[[1, 2, 3],[4, 5, 6]]
    .equals()は、上記の例でも使用されている.
    2つの配列に格納されているすべての要素を比較し、同じでtrueを返し、異なるでfalseを返します.toString()と同様に、.equals()は1次元アレイにのみ適用されます.
    (.equals()2次元配列.ver=deepEquals():すべての要素に再帰的にアクセスするため、次元制限X)
    String[][] str2D = {
                    {"chair", "의자"},
                    {"bed", "침대"}
            };
    String[][] str2D2 = {
    		{"chair", "의자"},
                    {"bed", "침대"}
            };
    
    System.out.println(Arrays.equals(str2D, str2D2)); //false
    System.out.println(Arrays.equals(str2D[0], str2D2[0])); // true
    
    System.out.println(Arrays.deepEquals(str2D, str2D2)); // true
    ②複製-copyOf()copyOfRange()二つの方法の違いは何ですか.
  • copyOf([배열 참조 변수], [newLength]):アレイ全体をコピーして新しいアレイを作成し、
    ([newLength]:必須項目で、新しい長さを指定してコピーできます.左から)
  • copyOfRange([배열 참조 변수], [from] ,[to]):配列の一部をコピーして新しい配列を作成し、返します.
    (もちろん[to]で指定されたindex値は含まれません.)
    また、実際のアレイの長さより大きいrangeを指定すると、オーバーフローの位置はゼロに塗りつぶされ、コピーされます.
  • int[] arr = {0, 1, 2, 3, 4};
    int[] arr2 = Arrays.copyOf(arr, arr.length) ; 
    int[] arr3 = Arrays.copyOf(arr, 3) ; 
    int[] arr4 = Arrays.copyOf(arr, 7) ; // 더 큰 길이 입력
    int[] arr5 = Arrays.copyOfRange(arr, 2, 4) ; 
    int[] arr6 = Arrays.copyOfRange(arr, 0, 7) ; // 더 큰 길이 입력
    
    System.out.println(Arrays.toString(arr)) ; // [0, 1, 2, 3, 4]
    System.out.println(Arrays.toString(arr2)) ; // [0, 1, 2, 3, 4]
    System.out.println(Arrays.toString(arr3)) ; // [0, 1, 2]
    System.out.println(Arrays.toString(arr4)) ; // [0, 1, 2, 3, 4, 0, 0] _ 0으로 채워짐
    System.out.println(Arrays.toString(arr5)) ; // [2, 3]
    System.out.println(Arrays.toString(arr6)) ; // [0, 1, 2, 3, 4, 0, 0] _ 0으로 채워짐
    ③並べ替え-sort()その名の通り、並べ替えに使う方法.
    int[] arr = {3, 2, 0, 1, 4};
    Arrays.sort(arr);
    System.out.println(Arrays.toString(arr)); [0, 1, 2, 3, 4]