/home/caleb/ASDV-Java/Semester 2/Assignments/lab-2D-arrays_CalebFontenot/src/main/java/com/calebfontenot/lab/d/arrays_calebfontenot/Lab2DArrays_CalebFontenot.java
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Project/Maven2/JavaApp/src/main/java/${packagePath}/${mainClassName}.java to edit this template
 */
package com.calebfontenot.lab.d.arrays_calebfontenot;

/**
 *
 * @author caleb
 */
public class Lab2DArrays_CalebFontenot {

    public static void main(String[] args)
    {
        int[][] a1 = {
            {1, 2, 3, 4},
            {5, 6, 7, 8},
            {9, 10, 11, 12}
        };
        String[][] a2 = {
            {"john", "paul", "james"},
            {"mary", "laura", "margaret"}
        };

        print(a1);
        System.out.println();
        print(a2);

        int a3[][] = new int[5][5];
        initializeArray(a3);
        System.out.println();
        print(a3);

        System.out.println();
        int[][] dupDup = dup(a1);
        print(dupDup);

        System.out.println();
        String[][] a4 = {
            {"ASDV", "MATH", "ENGL"},
            {"BIOL", "CHEM"},
            {"PHYS"}
        };
        print(a4);

        System.out.println();
        printColumnMajorOrder(a4);
        
        System.out.println();
        int[][] a5 = {
            {1},
            {1, 2},   
            {1, 2, 3}
        };
        System.out.println("Max number of columns in ar5 is " + maxNumberOfColumnsInJagged2DArray(a5));

        System.out.println();
        int[][][] a6 = {
            { {1, 2}, {3, 4} }, // table 1 NOT jagged 2x2
            {{5, 6}, {-1} }, // table 2 jagged
            {{7, 8 ,9}, {10, 11}, {12, 13, 14, 15}} // table 3 jagged
        };
        print(a6);

        String[] a7 = {"john", "Mary", "Paul", "nick", "Peter", "anna"};
        
        System.out.println();
        selectionSort(a7);
        print(a7);
    }

    public static void print(int[][] a1)
    {
        for (int i = 0; i < a1.length; ++i) {
            for (int j = 0; j < a1[i].length; ++j) {
                System.out.print(a1[i][j] + " ");
            }
            System.out.println();
        }
    }
     public static void print(int[][][] a1)
    {
        for (int i = 0; i < a1.length; ++i) {
            System.out.println("\n Table: " + (i+1));
            for (int j = 0; j < a1[i].length; ++j) {
                for (int k = 0; k < a1[i][j].length; ++k) {
                    System.out.print(a1[i][j][k] + " ");
                }
                System.out.println();
            }
            
        }
    }

    public static void print(String[][] a1)
    {
        for (int i = 0; i < a1.length; ++i) {
            for (int j = 0; j < a1[i].length; ++j) {
                System.out.print(a1[i][j] + " ");
            }
            System.out.println();
        }
    }
    
    public static void print(String[] a1)
    {
        for (int i = 0; i < a1.length; ++i) {
                System.out.print(a1[i] + " ");
        }
        System.out.println();
    }

    public static void initializeArray(int[][] a1)
    {
        for (int i = 0; i < a1.length; ++i) {
            for (int j = 0; j < a1[i].length; ++j) {
                a1[i][j] = (int) (Math.random() * 11);
            }
        }
    }

    public static int[][] dup(int[][] a1)
    {
        int[][] dupArray = new int[a1.length][a1[0].length];

        for (int i = 0; i < a1.length; ++i) {
            for (int j = 0; j < a1[i].length; ++j) {
                dupArray[i][j] = a1[i][j];
            }
        }
        return dupArray;
    }

    public static void printColumnMajorOrder(String[][] ar)
    {
       int row = 0;
       int column = 0;
       int max = maxNumberOfColumnsInJagged2DArray(ar);
       for (column = 0; column < max; ++column) {
           for (row = 0; row < ar.length; ++row) {
               if (column < ar[row].length) {
                   System.out.print(ar[row][column] + " ");
               }
           }
           System.out.println();
       }
    }
    
    public static int maxNumberOfColumnsInJagged2DArray(int[][] ar) {
        int maxNumberOfColumns = 0;
        for (int row = 0; row < ar.length; ++row) {
            if (ar[row].length > maxNumberOfColumns) {
                maxNumberOfColumns = ar[row].length;
            }
    }
        return maxNumberOfColumns;
    }
    public static int maxNumberOfColumnsInJagged2DArray(String[][] ar) {
        int maxNumberOfColumns = 0;
        for (int row = 0; row < ar.length; ++row) {
            if (ar[row].length > maxNumberOfColumns) {
                maxNumberOfColumns = ar[row].length;
            }
    }
        return maxNumberOfColumns;
    }
    public static void printARow(int[] rowOf2D) {
        for (int i = 0; i < rowOf2D.length; ++i) {
            System.out.print(rowOf2D[i] + " ");
        }
        System.out.println();
    }
    public static void selectionSort(int[] ar1) {
        for (int i = 0; i < ar1.length - 1; ++i) {
            for (int j = i + 1; j < ar1.length; ++j) {
                if (ar1[i] > ar1[j]) {
                    int temp = ar1[i];
                    ar1[i] = ar1[j];
                    ar1[j] = temp;
                }
            }
        }
    }
    public static void selectionSort(String[] ar1) {
        for (int i = 0; i < ar1.length - 1; ++i) {
            for (int j = i + 1; j < ar1.length; ++j) {
                // Compare all chars in string if first chars match
                char compChar1 = ar1[i].charAt(0), compChar2 = ar1[j].charAt(0);
                for (int index = 1; index < ar1[i].length(); ++index) {
                if (Character.toLowerCase(compChar1) == Character.toLowerCase(compChar2)) {
                    try {
                    compChar1 = ar1[i].charAt(index);
                    compChar2 = ar1[j].charAt(index);
                    } catch (Exception ex) {
                        // If it's failed, the index has gone out of range.
                        break;
                    }
                }
                }
                if (Character.toLowerCase(compChar1) > Character.toLowerCase(compChar2)) {
                    String temp = ar1[i];
                    ar1[i] = ar1[j];
                    ar1[j] = temp;
                }
            }
        }
    }
    
}