Sean
Sean

Reputation: 41

Java Program to Determine if there are any Duplicate Rows in the Matrix of a 2-Dimensional Array?

So, as the title says, I'm trying to put together a program that will compare the rows of a 2-dimensional array and determine if any rows are identical.

This has to be accomplished in two parts; determining whether any rows are identical and determining how many rows are identical. I'm trying to use a Boolean method to determine whether there are any identical rows and a separate method to determine how many rows are identical if the Boolean method returns true.

For example, if the array were:

1 2 3
2 3 1
1 2 3

Then the Boolean method would return true and the output would be:

The matrix has 2 identical rows.

The issue is that I don't know how I should set up the Boolean method; if I could figure that much out, the rest of the program would be simple to figure out.

How can I set up the Boolean method for this?

Here's the code I've come up with so far if anyone needs it:

public class IdenticalRows {

    public static void main(String[] args) {
        Scanner KBin = new Scanner(System.in);
        char run;
        int ROW, COL;

        System.out.println("Would you like to begin? (Y/N)");
        run = KBin.next().charAt(0);
        do {
            if(run!='y' && run!='Y' && run!='n' && run!='N') {
                System.out.println("Please only type 'y' or 'Y' to begin or type 'n' or 'N' to close the program.");
                System.out.println("Would you like to begin? (Y/N)");
                run = KBin.next().charAt(0);
            }
        }while(run!='y' && run!='Y' && run!='n' && run!='N');

        do {
            System.out.println("Please enter the number of rows:");
            ROW = KBin.nextInt();
            do {
                if (ROW<=0) {
                    System.out.println("Entry invalid; must be a positive integer greater than 0.");
                    System.out.println("Please enter the number of rows:");
                    ROW = KBin.nextInt();
                }   
            }while(ROW<=0);
            System.out.println("Please enter the number of columns:");
            COL = KBin.nextInt();
            do {
                if (COL<=0) {
                    System.out.println("Entry invalid; must be a positive integer greater than 0.");
                    System.out.println("Please enter the number of columns:");
                    COL = KBin.nextInt();
                }   
            }while(COL<=0);

            int[][] testDuplicates = new int[ROW][COL];
                randArray (testDuplicates, MIN, MAX);
            System.out.println("Thematrix is:");
                printArray(testDuplicates);
                    System.out.println(" ");
            boolean presence = duplicates(testDuplicates);
                if (presence=true) {
                    countDuplicates(testDuplicates);
                }
                else if (presence=false) {
                    System.out.println("There are no identical rows in this matrix.");
                }
            System.out.println("Would you like to run the program again? (Y/N)");
            run = KBin.next().charAt(0);
        }while(run=='y' || run=='Y');
    }

    public static void randArray(int[][] matrix, int low, int up) {//Establishes the values of the elements of the array
        Random rand = new Random();
        for (int r = 0; r < matrix.length; r++) {
            for (int c = 0; c < matrix[r].length; c++) {
                matrix[r][c] = rand.nextInt(up-low+1)+low;
            }   
        }   
    }

    public static void printArray(int[][] matrix) {//Prints the elements of the array in a square matrix
        for (int r = 0; r < matrix.length; r++) {
            for (int c = 0; c < matrix[r].length; c++) {
                System.out.printf("%5d",matrix[r][c]);
            }
            System.out.println(" ");
        }
    }

    public static boolean duplicates(int[][] list) {//Determines if any row(s) of elements ever repeat
         for (int r=0; r<list.length; r++) {
             for (int c=0; c<list[r].length; c++) {

             }
         } 
         return false;
    }

    public static void countDuplicates(int[][] matrix) {
        for (int r=0; r<matrix.length; r++) {
            for (int c=0; c<matrix[r].length; c++) {

            }
        }
    }

    public static final int MAX=3;
    public static final int MIN=1;
}

Thank you in advance to anyone who can help!

Upvotes: 2

Views: 682

Answers (1)

Ken Bekov
Ken Bekov

Reputation: 14015

First of all write the method that compares two rows:

private static boolean areIdentical(int[] a1, int[] a2) {
    if(a1.length != a2.length) return false;
    for(int i = 0; i < a1.length; i++) {
        if(a1[i] != a2[i]) return false; 
    }
    return true;
}

Now you can use this method to compare the rows. Just take every row from the array and compare it with every row below. Something like the next:

public static boolean duplicates(int[][] list) {
    for (int j = 0; j < list.length; j++) {
         if(j == list.length-1) return false; //don't need to compare last row
         for (int i = j + 1; i < list.length; i++) {
             if(areIdentical(list[j], list[i])) return true;
         }
     } 
     return false;
}

You can easily modify this code to count duplicates.

Upvotes: 2

Related Questions