1
votes

Existe-t-il un moyen d'imprimer un nombre variable d'éléments d'un tableau sur chaque ligne

Je veux pouvoir imprimer un nombre variable d'éléments de mon tableau sur chaque ligne.

[Alix, Jack, Alexis]

[Adam, John, Lexi]

[George, Gregory]

[Paul, Bjorn, Aaron, Joseph, Anderson]

La sortie de ceci me donnerait

[Alix, Jack, Alexis, Adam, John, Lexi, George, Gregory, Paul, Bjorn, Aaron, Joseph, Anderson]

Mais je veux que la sortie soit quelque chose du genre

XXX

Y a-t-il un moyen de faire cela? Le nombre d'éléments dans chaque ligne dans mon exemple n'est pas figé, il est juste important que je puisse faire varier la quantité de noms apparaissant dans chaque ligne dans la sortie. Merci


2 commentaires

Vous pouvez diviser le tableau en fonction de sa taille, puis les imprimer.


Dois-je utiliser une ArrayList pour ce faire?


3 Réponses :


-1
votes

Vous pouvez diviser le tableau manuellement et utiliser la méthode copyOfRange .

[Alix, Jack, Alexis]
[Adam, John, Lexi]
[George, Gregory, Paul]
[Bjorn, Aaron, Joseph]
[Anderson]

Sortie:

import java.util.Arrays;

public class HelloWorld {

     public static void main(String []args){
        String[] name = {"Alix", "Jack", "Alexis", "Adam", "John", "Lexi", 
             "George", "Gregory", "Paul", "Bjorn", "Aaron", "Joseph", "Anderson"};

        int splitArrayForSize = 3; 

        for(int i=0; i< name.length; i+=splitArrayForSize){

            String[] subArray = Arrays.copyOfRange(name, i, 
                                        Math.min(name.length, i + splitArrayForSize));

            String subArrayAsString = Arrays.toString(subArray);
            System.out.println(subArrayAsString);   
        }  
    }
}

Je suis sûr qu'il existe un moyen plus simple et fonctionnel d'y parvenir. Je serais intéressé par cette approche.


6 commentaires

@Sid. Vous n'avez pas répondu à la question du gars. Il a dit que le nombre d'éléments dans chaque ligne n'est pas "gravé dans le marbre", et dans son exemple, le nombre de noms sur chaque ligne diffère entre les lignes. - Joe a raison!


@Steve Je suis d'accord avec n'importe quelle réponse acceptée tant que cela aide.


Nous utilisons tous Arrays.copyOfRange que @Sid a publié en premier. C'est le cœur de la solution, le reste n'est que des "saveurs"


@Sid, mais cela n'aide pas la communauté à accepter une réponse qui ne donne pas le résultat que vous avez spécifié, surtout lorsqu'il y en a d'autres qui le font.


@Steve C'est ce que j'ai accepté. Je suis d'accord avec toute autre réponse acceptée si c'est mieux. N'oubliez pas que ce n'est pas moi qui ai accepté cette réponse. Nous pouvons exhorter le PO à accepter une autre meilleure réponse.


@Sid. Pardon. J'étais en train de mélanger mes noms. J'essayais de faire exactement ce que vous dites.



3
votes

Voici un exemple qui vous permettra de donner une liste de tailles pour chaque liste, afin que vous puissiez facilement produire la sortie que vous indiquez plutôt que d'avoir à avoir 3 noms dans chaque liste:

[Alix, Jack, Alexis]
[Adam, John, Lexi]
[George, Gregory]
[Paul, Bjorn, Aaron, Joseph, Anderson]

Sortie:

package com.inlet.ifserver;

import java.util.Arrays;

public class x {

    public static void main(String ...args) {
        String[] name = {"Alix", "Jack", "Alexis", "Adam", "John", "Lexi",
                "George", "Gregory", "Paul", "Bjorn", "Aaron", "Joseph", "Anderson"};

        int[] counts = { 3, 3, 2 };

        int start = 0;
        for (int count : counts) {
            int end = Integer.min(start + count, name.length);
            if (end == start)
                break;
            System.out.println(Arrays.toString(Arrays.copyOfRange(name, start, end)));
            start = end;
        }
        if (start < name.length)
            System.out.println(Arrays.toString(Arrays.copyOfRange(name, start, name.length)));
    }
}


1 commentaires

Ne soyez pas si prompt à voter et à accepter des réponses qui ne font pas ce que vous avez demandé (et vous pouvez changer d'avis).



0
votes

Comme @Sid l'a mentionné, Arrays.copyOfRange est la voie à suivre ici. Cet exemple fournit un tableau de différentes longueurs de blocs, il correspond donc à la sortie attendue dans votre question. Il ressemble à ceci

[Alix, Jack, Alexis]
[Adam, John, Lexi]
[George, Gregory]
[Paul, Bjorn, Aaron, Joseph, Anderson]

Vous pouvez ensuite l'appeler depuis votre Main comme ceci

public static void main(String[] args) {
    String[] name = {"Alix", "Jack", "Alexis", "Adam", "John", "Lexi",
            "George", "Gregory", "Paul", "Bjorn", "Aaron", "Joseph", "Anderson"};
    int[] blocks = {3, 3, 2, 5};

    printInBlocks(name, blocks);
}

Le résultat ressemble comme

public static void printInBlocks(String[] arr, int[] blocks) {
    int idx = 0;

    for (int blockSize: blocks) {
        String str = Arrays.toString(Arrays.copyOfRange(name, idx, idx += blockSize));
        System.out.println(str);
    }
}

Remarque

Les blocs qui contiennent le nombre d'éléments par ligne doivent avoir une somme totale égale à le nombre d'articles name


2 commentaires

La réponse de Joe est plus robuste. @molamk, je pense que le vôtre explose si vous ne donnez pas les bons numéros dans la liste des blocs. Joe fera de son mieux avec la liste donnée, et ignorera simplement les tailles de groupe au-delà de ce que la liste d'entrée autorise.


C'est plus robuste, je suis tout à fait d'accord là-dessus. La question n'est cependant pas de "robustesse". Et si c'était le cas, nous écririons des vérifications nulles, des tests unitaires et des tests de dépassement à ce stade