1
votes

Effacer et mettre en réseau et le remplir avec des zéros

Je crée un double tableau appelé MySize qui contiendra l'entrée utilisateur.

Comment effacer un tableau en le remplissant avec tout zéro à l'aide d'une instruction if?

J'ai essayé de créer une fonction appelée ClearMySize pour permettre à l'utilisateur d'effacer tout le tableau qu'il a créé et de le remplir de zéros

Exception in thread "main" java.lang.ArrayStoreException: java.lang.Integer
    at java.base/java.util.Arrays.fill(Arrays.java:3429)
    at trashmysize.TrashMySize.ClearMySize(TrashMySize.java:107)
    at trashmysize.TrashMySize.Menu(TrashMySize.java:136)
    at trashmysize.TrashMySize.UserEntryMySize(TrashMySize.java:91)
    at trashmysize.TrashMySize.Menu(TrashMySize.java:135)
    at trashmysize.TrashMySize.BuildMySize(TrashMySize.java:51)
    at trashmysize.TrashMySize.Menu(TrashMySize.java:134)
    at trashmysize.TrashMySize.main(TrashMySize.java:145)
C:\Users\Amanda\Documents\NetBeansProjects\trashMySize\nbproject\build-impl.xml:1330: The following error occurred while executing this line:
C:\Users\Amanda\Documents\NetBeansProjects\trashMySize\nbproject\build-impl.xml:936: Java returned: 1
BUILD FAILED (total time: 15 seconds)

Mais ça ne marche pas. Cela semble juste planter mon code. Je reçois le message d'erreur de:

package trashmysize;

import java.util.Arrays;
import java.util.Scanner;

public class TrashMySize {

    static double [][] MySize;   
    static int b1 = 0;
    static int b2 = 0;
    static Scanner scanSize = new Scanner(System.in); 
    static int columns = 0;
    static int rows = 0;
    static int NumberOfElements;
    
    static void PrintMySize(){       

        for (int r = 0; r < rows; r++) {
            for (int c = 0; c < columns; c++) {
                System.out.print(MySize[r][c] + " ");
            }
            System.out.println();
        }
}
    
    static void BuildMySize(){
        
        System.out.println("Enter the number of columns: ");
        rows = Integer.parseInt(scanSize.nextLine());
        System.out.println("Enter the number of rows: ");
        columns = Integer.parseInt(scanSize.nextLine());       
        MySize = new double[rows][columns];
        
        
        for (int r = 0; r < rows; r++) {
            for (int c = 0; c < columns; c++) {
                System.out.print(MySize[r][c] + " ");
            }
            System.out.println();
        }
        Menu();
}
    
    static void UserEntryMySize(){

        int blue = 0;
        double value = 0;
        
        
        while(blue < 1){
            System.out.println("Enter value:  ");
            value = Double.parseDouble(scanSize.nextLine());
            System.out.println("What row:   ");
            b1 = Integer.parseInt(scanSize.nextLine()) -1;
            System.out.println("What column: ");
            b2 = Integer.parseInt(scanSize.nextLine()) -1;
            
            try{
                if(b1 <= rows-1 && b2 <= columns-1){
                    System.out.println("Good position");
                }
                blue++;
            }
            catch(Exception e){
                System.out.println(e.getMessage());
                System.out.println("Not a good position");  
                blue++;
                BuildMySize();        
            }
        }
        
        
        MySize[b1][b2] = value;
        PrintMySize();
        Menu();
}           
    
    static void ClearMySize(){
                      
        if(MySize != null){
            //for (int i = 0; i < MySize.length; i++) 
                //MySize[i] = 0;
            
            Arrays.fill(MySize, 0);
        } else {
            System.out.println("Array is empty");
        }
        
        System.out.println("\nArray has been cleared: " + Arrays.toString(MySize));
        PrintMySize();
        Menu();
    
    }
    
    static public  void Menu(){
    
    int choice = 0;
        
        Scanner myScan = new Scanner(System.in);
        System.out.println("\nMain Menu\n"
                + "\n1. Build MySize"
                + "\n2. Add to MySize"
                + "\n3. Clear MySize"
                + "\nMake a choice: ");
        
        choice = Integer.parseInt(myScan.nextLine());
        
        switch(choice){
            case 1 -> BuildMySize();
            case 2 -> UserEntryMySize();
            case 3 -> ClearMySize();
            case 4 -> Menu();
            case 5 -> {
                System.out.println("Thank you for playing! Have a good day!");
                System.exit(0);
            }
        }
    }
    public static void main(String[] args) {
        Menu();
    }
    
}


Tout fonctionne comme il se doit, sauf pour ma fonction claire.


4 commentaires

qu'est-ce que MySize, un tableau ou la taille du tableau?


java.util.Arrays.fill( array, 0 ); docs.oracle.com/en/java/javase/11/docs/api/java.base/java/ut‌ il /…


"Cela ne fonctionne pas. Cela semble juste faire planter mon code." - Quel message d’erreur avez-vous reçu?


MySize est le nom du tableau. J'essaie de configurer une fonction appelée ClearMySize qui effacera les données que l'utilisateur a entrées dans le tableau. La fonction clear doit être dans une instruction if.


3 Réponses :


0
votes

Eh bien, la solution la plus simple est:

if(condition)
{
   for(int i=0; i<array.length; i++)
   {
      array[i] = 0
   }
}

Est-ce ce que vous recherchez?


0 commentaires

0
votes

Parcourez tous les index et définissez les valeurs sur 0.

if(array != null){
    for(int i=0;i<array.length;i++) array[i] = 0;
}


0 commentaires

0
votes

OK, donc c'est plus compliqué que les autres réponses ne l'ont réalisé.

La première chose à noter est qu'il ne s'agit pas d'un simple tableau. Le tableau est déclaré comme:

for (double[] d: MySize) {
    Arrays.fill(d, 0.0);
}

C'est un tableau de tableaux.

(Et vraiment sérieusement, c'est un choix horrible que vous avez fait pour le nom de la variable du tableau. Cela n'a aucun rapport avec ce que la variable signifie, et c'est une violation majeure du style Java pour démarrer.)

Vous essayez de le remplir comme ceci:

 Arrays.fill(int[], int);       #1 

 Arrays.fill(double[], double); #2

 Arrays.fill(Object[], Object); #3

Alors maintenant, nous regardons les surcharges pour Arrays.fill et nous voyons qu'il y a trois surcharges qui pourraient être pertinentes:

  Arrays.fill(MySize, 0); 

Le premier ne s'applique pas car double[][] n'est pas compatible avec int[] (bien que le 2ème argument corresponde exactement).

Le second ne s'applique pas car double[][] n'est pas compatible avec double[] . (Le deuxième argument est compatible avec une conversion d'élargissement primitive.)

Le troisième s'applique parce que double[][] EST compatible avec Object[] , parce que double[] est un sous-type d' Object . Cependant, pour que cela "fonctionne", l' Object vous fournissez comme deuxième argument doit être un double[] . Ça ne l'est pas. C'est un int . Et Java effectue une conversion de boxe pour transformer cela en un Integer ... car c'est ce que le JLS dit qu'il devrait faire.

Par conséquent, fill tentera d'assigner un Integer dans une cellule d'un tableau double[] ... ce qui lèvera une exception.

Leçon 1. Soyez prudent avec les types de tableaux multidimensionnels en Java. Ils ne sont pas entièrement intuitifs.

Leçon 2. Array.fill(...) pour les tableaux 1D.


La solution actuelle est la suivante:

  static double [][] MySize;   

ou vous pouvez utiliser une boucle for imbriquée et effectuer le remplissage à la main.


2 commentaires

Merci. Je sais, toutes les variables ne sont pas géniales dans ce projet mais nous n'avons pas eu le choix sur les noms. Cela a fonctionné, mais il doit être présenté dans une déclaration if.


J'ai modifié cela un peu et je l'ai fait fonctionner suffisamment pour que le projet de devoirs soit terminé !! Merci beaucoup!