-2
votes

Fusion de deux tableaux 2D (M + N)

Je suis un programme de première année essayant de résoudre ce défi qui nous a été confié à l'université.

Image de la question

Capture d'écran

Il y a une faute de frappe là où il est dit (N + K) alors qu'en fait il s'agit en fait de colonnes (M + K).

Ma tentative pour cette question va comme suit

public static int[][] mergeArrays(int[][] arrayA, int[][] arrayB){
    int rows = 3;
    int columns = arrayA[0].length + arrayB[0].length;      
    int[][] mergedArray = new int[rows][columns];
    int k = 0;
    for (int i = 0; i < rows; i++)
    {
        for ( int j = 0  ; j < columns; j++)
        {
            try
            {
                mergedArray[i][j] = arrayA[i][j];
            }
            catch (ArrayIndexOutOfBoundsException e)
            {
                mergedArray[i][j] = arrayB[i][k];
                k += 1;
            }
        }
    }
    return mergedArray;
}

public static void main(String [] args)
{
    int [][] a1 = { {1,2,3,3,3} , {3,2,1,6,3} , {4,5,6,1,3}  };
    int [][] a2 = { {1,9,7,2,3} , {0,7,8,3,2} , {3,8,9,7,2} };

    int[][] m = mergeArrays(a1,a2);
    for (int[] x : m)
    {
        for (int y : x)
        {
            System.out.print(y + " ");
        }
        System.out.println();
     }
}

Le programme ne fonctionne pas pour une raison quelconque. Je ne sais pas ce qui ne va pas avec mon approche ici. J'apprécierais vraiment si quelqu'un m'aide.


3 commentaires

Définissez "ne fonctionne pas". Compile-t-il? Quelle est l'erreur? S'il compile, qu'est-ce qui est excepté par rapport à la sortie réelle?


@Eesa Envisagez de choisir l'une des réponses disponibles ci-dessous, et acceptez-la et votez-la si elle résout votre problème. C'est une pratique courante sur ce site, pour remercier le répondant pour son temps et ses efforts. ;)


Désolé, je n'étais pas disponible, les gars envisagent de savoir quels sont les fuseaux horaires !. Par ne fonctionne pas, je voulais dire que je ne sais pas ce qui ne va pas dans ma boucle, j'ai du mal à visualiser ce qui fait que mes limites sont gâchées.


3 Réponses :


1
votes

Vous ne le fusionnez pas correctement. Votre logique est que si l'index de colonne arrayA est hors limites, vous ajoutez à partir des colonnes de arrayB. Mais que se passe-t-il si cela est également hors limites, comme dans votre cas. Puisque vous incrémentez toujours son index k. Vous pouvez simplement itérer sur 2 tableaux séparément et fusionner dans le tableau résultant.

public static int[][] mergeArrays(int[][] arrayA, int[][] arrayB) {
        int rows = 3;
        int columns = arrayA[0].length + arrayB[0].length;
        int[][] mergedArray = new int[rows][columns];
        int k = 0;
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < arrayA[0].length; j++) {
                mergedArray[i][k++] = arrayA[i][j];
            }
            for (int j = 0; j < arrayB[0].length; j++) {
                mergedArray[i][k++] = arrayB[i][j];
            }
            k=0;
        }
        return mergedArray;
    }


0 commentaires

1
votes

Puisque vous êtes étudiant, je pense que mieux vaut si nous donnons un indice, mais comme la solution est déjà là, vous pouvez également vérifier celle-ci:

public static int[] merge(int[] first,int[] second) {
    return ArrayUtils.addAll(first, second);
}

public static void main(String[] args) {
    int [][] a1 = { {1,2,3,3,3} , {3,2,1,6,3} , {4,5,6,1,3}};
    int [][] a2 = { {1,9,7,2,3} , {0,7,8,3,2} , {3,8,9,7,2}};
    int [][] a3 = new int[a1.length][];

    for (int i = 0; i < a1.length; i++) {
        a3[i] = merge(a1[i],a2[i]);
    }
    for (int[] ints : a3) {
        StringJoiner joiner = new StringJoiner(",","[","]");
        for (int i1 : ints) {
            joiner.add(i1+"");
        }
        System.out.println(joiner.toString());
    }
}


0 commentaires

1
votes

Sans utiliser aucune bibliothèque, de manière manuelle, voici ma réponse de travail.
Je n'ai utilisé aucun d'entre eux, puisque nous n'étions pas autorisés, lorsque j'étais étudiant.

1 2 3 3 3 1 9 7 2 3
3 2 1 6 3 0 7 8 3 2 
4 5 6 1 3 3 8 9 7 2 

Le résultat est le même, comme prévu, de l'image de votre question:

public class Main {
    private static int[][] mergeArrays(int[][] a1, int[][] a2) {
        // Count rows and cols length.
        int rows = a1.length;
        int cols_a1 = a1[0].length;
        int cols_a2 = a2[0].length;

        // Total number of cols
        int cols = cols_a2 + cols_a1;

        int [][] merged = new int[rows][cols];


        for (int i = 0; i < rows ; ++i) {
            for (int j = 0; j < cols_a1; ++j) {
                merged[i][j] = a1[i][j];

            }
            // To not overwrite values,
            // the trick is to add an offset, while assigning,
            // which is the amount of elements (cols_a1) used by the previous loop.
            // Basically, we are shifting the k-index by this constant,
            // as to not overwrite the values assigned from the previous 
            // inner loop.
            for (int k = 0; k < cols_a2; ++k) {
                merged[i][cols_a1 + k] = a2[i][k];
            }
        }
        // Return the merged array
        return merged;
    }

    // I refactored your good printing code into a method, for readability.
    private static void print2darray(int[][] array2d) {
        for (int[] x : array2d) {
            for (int y : x) {
                System.out.print(y + " ");
            }
            System.out.println();
        }
    }

    public static void main(String[] args) {
        int [][] a1 = {{1,2,3,3,3} , {3,2,1,6,3} , {4,5,6,1,3}};
        int [][] a2 = {{1,9,7,2,3} , {0,7,8,3,2} , {3,8,9,7,2}};
        int [][] merged = mergeArrays(a1, a2);
        print2darray(merged);
    }
}


4 commentaires

Merci beaucoup de frappeur! Pourriez-vous expliquer ce que ++ i fait, c'est la première fois que je vois un tel opérateur. Désolé, impossible de répondre à temps (fuseaux horaires ...)


@Eesa Ne vous inquiétez pas, j'ai pensé que vous viviez peut-être dans un autre fuseau horaire. Ok, il y a donc un excellent tutoriel sur les boucles for en Java par la société qui le possède. docs.oracle.com/javase/tutorial/java/nutsandbolts/for.html


@Eesa Vérifiez également cette courte réponse pour les différences de ++i et i++ stackoverflow.com/questions/2371118/...


Personnellement, quand j'ai besoin d'une boucle for avec une variable d'index, j'utilise toujours l'opérateur de pré-incrémentation, car quand j'ai commencé à programmer avec C comme premier langage, c'était censé être légèrement plus rapide. Ce n'est pas le cas pour Java, comme expliqué ici stackoverflow.com/questions/4831748/...