Visualizzazione dei risultati da 1 a 3 su 3

Discussione: rifermimento a matrice

  1. #1

    rifermimento a matrice

    Salve ho un codice così composto:
    codice:
    public class StagePrincipale extends Stage {
        
        private final int DIM;
        Circle[][] matrix;
        
        public StagePrincipale(int righe){
            
            DIM=righe;
            matrix=new Circle[righe][righe];
            GridPane g=new GridPane();
            
            
            for(int i=0;i<righe;i++){
                for(int j=0;j<righe;j++){
                    
                    Circle c=new Circle(25);
                    c.setOpacity(0);
                    g.add(c, j , i );
                    matrix[j][i]=c;
                }
            }
            
            HBox togglegroup=new HBox();//contenitore bottoni superiori
            ToggleGroup algoritmi=new ToggleGroup();
            ToggleButton alg1 = new ToggleButton("alg1");
            ToggleButton alg2 = new ToggleButton("alg2");
            ToggleButton alg3 = new ToggleButton("alg3");   
            alg1.setToggleGroup(algoritmi);
            alg1.setId("1");
            alg2.setToggleGroup(algoritmi);
            alg2.setId("2");
            alg3.setToggleGroup(algoritmi);
            alg3.setId("3");
            togglegroup.setAlignment(Pos.CENTER);
            togglegroup.setSpacing(5);
            togglegroup.getChildren().addAll(alg1,alg2,alg3);
            togglegroup.setPadding (new Insets (10, 0, 10, 0)); //spazia i bottoni sopra e sotto
            algoritmi.selectToggle(alg1);//di default il selezionato è l'1
            
            
            final Button step = new Button("step");
            step.setMinWidth(80);
            
            step.setOnAction(new EventHandler<ActionEvent>() {
                
                @Override
                public void handle(ActionEvent event) {
                    ToggleButton a=(ToggleButton) algoritmi.getSelectedToggle();
                    switch(a.getId()){
                        case "1":new Algoritmo1(matrix);
                            break;
                        case "2":new Algoritmo2(matrix);
                            break;
                        case "3":new Algoritmo3(matrix);
                            break;
                    }
                }
            });
        
        
        }
        
    }
    
    
    public class Algoritmo1 {
        public Algoritmo1(Circle[][] matrix){
            int dim=matrix.length;
            Circle[][] matricecopia=new Circle[dim][dim];
            
            for(int i=0;i<dim;i++){
                        for(int j=0;j<dim;j++){
                            matricecopia[i][j]=new Circle(25);
                            
                            if(i!=0 && j!=dim-1)
                                matricecopia[i][j]=matrix[i-1][j+1];
                            else
                                matricecopia[i][j].setOpacity(0);
                        }
            }
    
    
            matrix=matricecopia;
            }
        }
    c'è sicuramente qualcosa che manca perchè ho tagliato buona parte del codice per renderlo più breve ma alla mia domanda non dovrebbe servire. Tutto mi funziona e Algoritmo1 fa quello che voglio che faccia infatti alla fine con l'ultimo comando "matrix=matricecopia" stampando matrix questo ha i valori che voglio. Il problema è che appena ristampo il matrix sotto allo switch nella prima classe ritorna com'era prima. La mia domanda è matrix non è passato per riferimento e quindi dovrebbe cambiare? Se sbaglio qualcosa come posso risolvere questa cosa?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da campaenrico Visualizza il messaggio
    codice:
    public class Algoritmo1 {
        public Algoritmo1(Circle[][] matrix){
                     .......
    
            matrix=matricecopia;
            }
        }
    Nell'ultimo assegnamento, tu assegni al parametro del costruttore di Algoritmo1, che è una variabile ben distinta dal 'matrix' campo di istanza di un oggetto StagePrincipale.

    Quando il costruttore di Algoritmo1 viene invocato riceve una copia del reference dell'array Circle[][] istanziato in StagePrincipale. Quindi in quel momento 'matrix' parametro di Algoritmo1 e 'matrix' campo di StagePrincipale hanno lo stesso valore, ovvero "puntano" allo stesso identico oggetto array Circle[][].

    Ma essendo appunto variabili distinte, se cambi il parametro 'matrix' NON cambi ciò che c'è in 'matrix' campo di StagePrincipale.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Ok grazie mille ho capito, proverò facendo una funzione che mi ritorna la matrice allora.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.