web-dev-qa-db-fra.com

Comment utiliser une variable d'une méthode dans une autre méthode?

Je veux savoir comment utiliser la variable a[i][j] dans la méthode Scores() pour l'utiliser dans les méthodes MD() et sumD() dans le code suivant:

Dans mon code, les méthodes MD() et sumD() ne peuvent pas obtenir le résultat.

public class Test3 {

  public void Scores() { 
   double[][] a= new double[3][5];
   int i,j;

   for(i=0; i<3; i++ ){
        for(j=0; j<5; j++){
                a[i][j]= (double) Math.random(); 
                System.out.println("a[" + i + "][" + j + "] = " +a[i][j]);
        }   
   }   
}
  public void MD(){
   double[][] b =new double[3][5];
   int [] m = new int[5];
   int i,j;
   //double[][] a= new double[3][5];

   for(j= 0; j<5; j++)
        for(i=0 ; i<3 ; i++) 
        {
           b[i][j]=0.0;                                                    
           if(a[i][j]>0.0) 
              m[j]++;
        }   
    for(j= 0; j<5; j++){
        for(i=0 ; i<3 ; i++) {
           if(a[i][j] > 0.0){
               b[i][j]=a[i][j]*m[j];
               System.out.println("b[" + i + "][" + j + "] = " + b[i][j]);
           }    
       }        
   }                
}

public void sumD(){

int i,j,n;
double[] sum= new double[3];
double[] k= new double[3];
//double[][] a= new double[3][5];

  for(i=0; i<3; i++){
      n=0;
      sum[i]=0.0;
      for(j=0; j<5; j++){
          if(a[i][j]>0.0){
              sum[i] += (a[i][j])*2;
              n++;
          }                
      }
      k[i]=sum[i]/n;
      System.out.println("k[" + i + "] = " + k[i]); 
 }
}

public static void main(String[] args){
    Test3 print= new Test3();
    print.Scores();
    print.MD();
    print.sumD();

 }  
}

Merci d'avance.

4
Jame

Tu ne peux pas. Les variables définies dans une méthode sont locales à cette méthode.

Si vous souhaitez partager des variables entre méthodes, vous devez les spécifier en tant que variables membres de la classe. Alternativement, vous pouvez les passer d'une méthode à une autre en tant qu'arguments (ceci n'est pas toujours applicable).

13
Oliver Charlesworth

On dirait que vous utilisez des méthodes d'instance plutôt que des méthodes statiques.

Si vous ne souhaitez pas créer un objet, vous devez déclarer toutes vos méthodes statiques.

private static void methodName(Argument args...)

Si vous souhaitez qu'une variable soit accessible par toutes ces méthodes, vous devez l'initialiser en dehors des méthodes et limiter sa portée, déclarez-la privée.

private static int[][] array = new int[3][5];

Les variables globales sont généralement méprisées (en particulier dans des situations telles que la vôtre) car, dans un programme à grande échelle, elles peuvent faire des ravages. Par conséquent, le fait de le rendre privé évite au moins certains problèmes.

De plus, je dirai l'habituel: vous devriez essayer de garder votre code un peu propre. Utilisez des noms de classe, de méthode et de variable descriptifs et veillez à ce que votre code soit net (avec l'indentation, les sauts de ligne, etc.) et cohérent.

Voici un dernier exemple (abrégé) de ce à quoi votre code devrait ressembler:

public class Test3 {
    //Use this array in your methods
    private static int[][] scores = new int[3][5];

    /* Rather than just "Scores" name it so people know what
     * to expect
     */
    private static void createScores() {
        //Code...
    }
    //Other methods...

    /* Since you're now using static methods, you don't 
     * have to initialise an object and call its methods.
     */
    public static void main(String[] args){
        createScores();
        MD();   //Don't know what these do
        sumD(); //so I'll leave them.
    }
}

Idéalement, puisque vous utilisez un tableau, vous devez créer le tableau dans la méthode principale et le transmettre sous forme d'argument à chaque méthode. Toutefois, expliquer le fonctionnement de ce dernier est probablement une toute nouvelle question. cette.

5
Hedja

Il suffit de déplacer la déclaration de a pour en faire une propriété privée de la classe Test3, comme ceci:

public class Test3 {

  private double[][] a;
  public void Scores() { 
   a= new double[3][5];
   int i,j;
...etc...
2
Diego

créez simplement une variable de classe [i] [j], déclarez-la en dehors de Scores(), juste en dessous du nom de la classe

public class Test3 {
  double[][] a= new double[3][5];
  public void Scores() { 
   ....
  }
  .....
}
1
Parth

vous pouvez déclarer un pointeur de tableau 2D en tant que membre de la classe. Puis déclarez la taille et la valeur dans une fonction membre. Dans ce cas, vous pouvez y accéder depuis une autre fonction.

Voir l'utilisation de T [] [] dans ce code

    public class Knapsack {

    //private static Scanner in;
    int T[][];

    int MaximumVal(int wt[],int val[], int total){
        int l=total;
        int m=val.length;
        T = new int[m+1][l+1];

        for (int i=0; i<=m; i++){
            for(int j=0; j<=l; j++){
                if(i==0 || j==0){
                    T[i][j]=0;
                    continue;
                }
                if(j-wt[i-1] >= 0){
                    T[i][j]=Math.max(T[i-1][j], val[i-1]+T[i-1][j-wt[i-1]]);
                }
                else{
                    T[i][j]=T[i-1][j];
                }
            }
        }
        return T[m][l];
    }

    void PrintPath(int wt[], int val[]){
        int i=T.length-1;
        int j=T[0].length-1;
        while(j!=0){
            if(i>0){
                while(T[i][j]==T[i-1][j]){
                    i--;
                }
            }
            System.out.print(wt[i-1]+" ");
            j=j-wt[i-1];
            i--;
        }
    }


    //Main Function with test case ::

    public static void main(String args[]){
        int wt[]={1,3,4,5};
        int val[]={1,4,5,7};
        Knapsack K = new Knapsack();

        System.out.print("Enter the total value:  ");
        //in = new Scanner(System.in);
        //int total = in.nextInt();

        int result = K.MaximumVal(wt,val,7); // pass total
        System.out.println("Total value is "+ result);

        K.PrintPath(wt,val);
    } 
}
1
Shuvendu Roy

Passer un argument ou faire une classe var

0
Micah Armantrout
public class Test3 {
  double[][] a=new double[3][5];
  public void Scores() { 

   int i,j;

   for(i=0; i<3; i++ ){
        for(j=0; j<5; j++){
                a[i][j]= (double) Math.random(); 
                System.out.println("a[" + i + "][" + j + "] = " +a[i][j]);
        }   
   }   
}
  public void MD(){
   double[][] b =new double[3][5];
   int [] m = new int[5];
   int i,j;
   //double[][] a= new double[3][5];

   for(j= 0; j<5; j++)
        for(i=0 ; i<3 ; i++) 
        {
           b[i][j]=0.0;                                                    
           if(a[i][j]>0.0) 
              m[j]++;
        }   
    for(j= 0; j<5; j++){
        for(i=0 ; i<3 ; i++) {
           if(a[i][j] > 0.0){
               b[i][j]=a[i][j]*m[j];
               System.out.println("b[" + i + "][" + j + "] = " + b[i][j]);
           }    
       }        
   }                
}

public void sumD(){

int i,j,n;
double[] sum= new double[3];
double[] k= new double[3];
//double[][] a= new double[3][5];

  for(i=0; i<3; i++){
      n=0;
      sum[i]=0.0;
      for(j=0; j<5; j++){
          if(a[i][j]>0.0){
              sum[i] += (a[i][j])*2;
              n++;
          }                
      }
      k[i]=sum[i]/n;
       System.out.println("k[" + i + "] = " + k[i]); 
  }
}

public static void main(String[] args){
    Test3 print= new Test3();
    print.Scores();
    print.MD();
    print.sumD();

 }  
}
0
Atikant Negi

Si vous voulez pouvoir utiliser la matrice 2d, vous devez le déclarer en dehors de vos méthodes.

public class Test3 {
    double[][] a= new double[3][5]; 

    public void Scores() { 
       //double[][] a= new double[3][5];  
       int i,j;

       for(i=0; i<3; i++ ){
          for(j=0; j<5; j++){
            a[i][j]= (double) Math.random(); 
            System.out.println("a[" + i + "][" + j + "] = " +a[i][j]);
          }   
       }   
    }
    .......

Vous verrez que j'ai déplacé la déclaration d'un (précédemment dans Scores (), et que j'ai commenté) en dehors de la fonction, et que c'est maintenant un champ de la classe Test3. Lorsque vous déclarez une variable dans une fonction, celle-ci est locale. Il ne peut pas être vu par d'autres fonctions, etc. Si vous le déclarez en tant que champ de classe, vos fonctions peuvent le voir. Jetez un coup d'oeil à ceci, car cela peut aider. Language/VariableScope.htm "> http://www.Java2s.com/Tutorial/Java/0020_Language/VariableScope.htm Le terme" portée "fait simplement référence à la durée de vie d'une variable et à son emplacement . J'espère que cela t'aides!

0
DunClickMeBro