Java - Compteur de tableau 2D


J'ai une question de devoirs que j'ai du mal à déboguer. Le but du programme est d'indiquer quelles lignes et colonnes ont les mêmes nombres, ainsi que les diagonales majeures et mineures. Jusqu'à présent j'ai genre d'compris les lignes et les colonnes qui sont les mêmes, et de les imprimer.

Voici la sortie du programme jusqu'à présent:

0 0 0 0 0 0 0 0 

0 0 1 0 1 0 0 0 

0 0 0 0 1 0 1 0 

0 0 1 0 0 1 1 0 

0 0 1 0 0 1 1 0 

0 0 0 0 0 0 1 0 

0 0 0 0 0 0 0 0 

0 0 1 1 1 1 1 0 

All 0 on row 0

All 0 on column 0

All 0 on column 1

All 0 on column 1

All 0 on column 7

All 0 on column 7

Comme vous pouvez le voir la colonne d'impression est répétée, et je ne peux pas comprendre pourquoi et comment le résoudre. J'ai aussi un problème dans lequel il n'est pas l'affichage ligne 6 comme étant tout de même.

Ma sortie souhaitée devrait être:

All 0 on row 0

All 0 on row 6

All 0 on column 0

All 0 on column 1

All 0 on column 7

Merci d'avance.

import java.util.Scanner;

public class javaTest
{
// Main method
public static void main(String[] args)
{

    int[][] array = {
        {0,0,0,0,0,0,0,0},
        {0,0,1,0,1,0,0,0},
        {0,0,0,0,1,0,1,0},
        {0,0,1,0,0,1,1,0},
        {0,0,1,0,0,1,1,0},
        {0,0,0,0,0,0,1,0},
        {0,0,0,0,0,0,0,0},
        {0,0,1,1,1,1,1,0}
    };

    for(int i = 0; i < array.length; i++)
    {
        for(int j = 0; j < array[i].length; j++)
            System.out.print(array[i][j] + " ");

        System.out.println();
    }
    checkRow(array);
    checkCol(array);
}

// Check if the row is the same
public static void checkRow(int array[][])
{
    String checkRow = "";
    int rowCount = 0;
    int count = 0;
    for(int i = 0; i < array.length; i++)
    {
        for(int j = 0; j < array[i].length;j++)
        {
            // Create a new array to compare 
            int num = array[i][j];
            for(int k = 0; k < array[i].length; k++)
            {
                // Check if the first number of the row is equal to the next
                if(num == array[j][k])
                    // If so increment count
                    count++;
                else
                    count = 0;
            }
            // If all numbers of the row is the same, total would be 8 and print
            if(count == array.length)
                System.out.println("All " + num + " on row " + rowCount);
        }
        rowCount++;
    }
}

// Check if column is the same
public static void checkCol(int array[][])
{
    String checkCol = "";
    int colCount = 0;
    int count = 0;
    for(int i = 0; i < array.length; i++)
    {
        for(int j = 0; j < array[i].length; j++)
        {
            int num = array[i][j];
            for(int k = 0; k < array[i].length; k++)
            {
                if(num == array[k][i])
                    count++;
                else
                    count = 0;
            }
            if(count == array.length)
                System.out.println("All " + num + " on column " + colCount);
        }
        colCount++;
    }
}

}

Author: Madhawa Priyashantha, 2016-04-04

3 answers

Je ne pense pas que vous ayez besoin de 3 boucles imbriquées dans vos méthodes checkRow ou checkCol. Je vais vous expliquer comment vous pourriez le faire avec seulement 2 méthodes pour checkCol.

Vous auriez toujours votre 2 extérieur pour les boucles

i allant de 0 à array.length - 1

j allant de 0 à array[i].length - 1

Ensuite, à l'intérieur de cette boucle for, vous vérifiez si chaque élément à array[i][j] est égal à array[0][j] (qui est l'élément à la 0ème ligne pour cette colonne particulière).

Conserve un indicateur booléen que vous définissez sur false si l'un quelconque des éléments dans une colonne particulière n'est pas égal à l'élément à l'0e ligne de la colonne. Assurez-vous que cet indicateur est défini sur true avant même d'entrer dans la boucle for.

En dehors de la boucle for interne, vous vérifiez si l'indicateur est défini sur true, si c'est le cas, imprimez cette colonne et ce numéro particuliers. Réinitialisez le drapeau à true.

Je pense que cela résoudrait probablement le problème de l'impression de colonnes plusieurs fois. Vous pouvez également faire quelque chose de similaire pour les lignes.

Faites-moi savoir si vous ne comprenez pas toutes les étapes.

 3
Author: maesydy, 2016-04-04 01:30:24

Je crois que c'est votre problème

    if(count == array.length)
            System.out.println("All " + num + " on row " + rowCount);
    }
    rowCount++;// this is inside the first for loop but not the second.  so it has to go through all the other inner for loops before it can count this again so its skipping rows
 1
Author: Steve, 2016-04-04 02:10:15

Ce problème peut être résolu en utilisant deux boucles for, comme suggéré par @maesydy. Voici l'implémentation avec sortie.

public class Test {
// Main method
public static void main(String[] args) {

    int[][] array = {
            {0, 0, 0, 0, 0, 0, 0, 0},
            {0, 0, 1, 0, 1, 0, 0, 0},
            {0, 0, 0, 0, 1, 0, 1, 0},
            {0, 0, 1, 0, 0, 1, 1, 0},
            {0, 0, 1, 0, 0, 1, 1, 0},
            {0, 0, 0, 0, 0, 0, 1, 0},
            {0, 0, 0, 0, 0, 0, 0, 0},
            {0, 0, 1, 1, 1, 1, 1, 0}
    };

    for (int i = 0; i < array.length; i++) {
        for (int j = 0; j < array[i].length; j++)
            System.out.print(array[i][j] + " ");

        System.out.println();
    }
    checkRow(array);
    checkCol(array);
}

/**
 * Check if all elements of row are same
 * @param a array
 */
public static void checkRow(int a[][]) {
    for (int r= 0; r < a.length; r++) {
        int rowNum = r + 1;
        boolean isMatching = true;
        for (int c = 0; c < a[r].length -1; c++) {
            //Compare two subsequent columns in same column
                if(a[r][c] != a[r][c+1]) {
                    isMatching = false;
                    break;
                }
            }
       //If all elements matched print output 
       if(isMatching) {
           System.out.println("Row " + rowNum + " has all matching elements");
       }
    }
}

/**
 * Check if all elements of column are same
 * @param a array
 */
public static void checkCol(int a[][]) {
    for (int c = 0; c < a.length; c++) {
        int colNum = c + 1;
        boolean isMatching = true;
        for (int r = 0; r < a[c].length -1; r++) {
            //Compare two subsequent rows in same column
            if(a[r][c] != a[r+1][c]) {
                isMatching = false;
                break;
            }
        }
        //If all elements matched print output
        if(isMatching) {
            System.out.println("Column " + colNum + " has all matching elements");
        }
    }
}

}

Notes: J'ai utilisé des index nommés r/c pour représenter l'index des lignes et des colonnes.

Sortie:

0 0 0 0 0 0 0 0 
0 0 1 0 1 0 0 0 
0 0 0 0 1 0 1 0 
0 0 1 0 0 1 1 0 
0 0 1 0 0 1 1 0 
0 0 0 0 0 0 1 0 
0 0 0 0 0 0 0 0 
0 0 1 1 1 1 1 0 
Row 1 has all matching elements
Row 7 has all matching elements
Column 1 has all matching elements
Column 2 has all matching elements
Column 8 has all matching elements

J'espère que cela aide. Bonne programmation, profitez-en!

 1
Author: MSameer, 2016-04-04 02:28:44