Search code examples
javaarraysmultidimensional-array

Java remove duplicates from 2d array


I need to do this problem:

" Prepare a rectangular array (with random natural positive dimensions) of int i variables fill it with random values from the interval [0,10). Create and display a new board created from input array by removing duplicates from each row (leaving only one occurrence of each value). "

I am not allowed to use any libraries

I tried to change dublicates to a number out of the interva [0,10) "1337" for example, and then delete all "1337" thought it would be easier, but I have out of bounds exeption

Main function:

System.out.println("Zadanie 2");
int size = (int)(Math.random()*10);
int[][] arr = new int[size][size];
for (int i = 0; i < arr.length; i++) {
    for (int j = 0; j < arr[i].length; j++) {
        arr[i][j] = (int)(Math.random()*10);
    }
}
removeDuplicates2D(arr);
System.out.println(Arrays.deepToString(arr));

My removeDuplicates2D function:

public static void removeDuplicates2D(int[][] tab) {
    int column = 0, row = 0;
    while (column != tab.length-1 || row != tab.length-1){
        if (column == 0 && row == 0){
            column++;
            continue;
        }
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < column; j++) {
                if(tab[i][j] == tab[row][column]){
                    tab[row][column] = 1337;  // will change all duplicates to 1337
                }
            }
        }
        if(++column == tab.length-1){
            row++;
            column = 0;
        }
    }
}

Solution

  • For the following 6x8 table

    [4, 3, 2, 5, 2, 4, 3, 0]
    [3, 7, 4, 8, 3, 7, 8, 7]
    [9, 4, 5, 0, 6, 7, 3, 0]
    [0, 2, 3, 1, 5, 3, 7, 7]
    [7, 8, 3, 9, 4, 9, 7, 4]
    [8, 2, 8, 4, 0, 0, 1, 1]
    

    The following would be the result of duplicates removed.

    [4, 3, 2, 5, 0]
    [7, 8]
    [9, 6]
    [1]
    []
    []
    

    Details

    • first, establish a single array to hold dups. The location of the value [0-9) indicates if the value has been seen or not. The value is its own index.
    • then just iterate thru the array via rows and columns.
      • when you first encounter a value, if it's dup position is not 0, it must have been seen, so set the current tab value to 1337.
      • if not 0, then set the dup position to 1 and increment the itemCount. This count will be used to create the new row for first seen values.

    Once the dups for a given row have been found

    • create a replacement row using itemCount
    • then iterate over row adding values that are not 1337
    • then assign that row to the current row position for the table.
    public static void removeDuplicates2D(int[][] tab) {
    
        int[] dups = new int[10];
    
        for (int row = 0; row < tab.length; row++) {
            int itemCount = 0;
            int[] currentRow = tab[row];
            for (int col = 0; col < currentRow.length; col++) {
                int value = currentRow[col];
                if (dups[value] != 0) { // has been seen?
                    currentRow[col] = 1337;
                } else {
                    itemCount++;
                    dups[value] = 1; // indicate value has been seen.
                }
            }
    
            int[] newRow = new int[itemCount];
            for (int k = 0, i = 0; i < currentRow.length; i++) {
                if (currentRow[i] != 1337) {
                    newRow[k++] = currentRow[i];
                }
            }
    
            tab[row] = newRow;
        }
    }