2010-10-22 17 views
7

Existe-t-il un moyen de convertir un tableau en une liste de paramètres ..? Je souhaite convertir "a" en une liste de paramètres/arguments pour appeler automatiquement la fonction appropriée.Java Convert Array en paramètres

+0

Et pourquoi ne pas utiliser 'vide MyPrint (int ... x)' comme l'a suggéré? – Cristian

+0

parce que je ne peux pas modifier la fonction. –

+0

Est-ce que MyPrint va prendre seulement 1, 2 ou 3 arguments alors? – shoebox639

Répondre

8
main(){ 
    int[] a = {1,2,3}; 
    MyPrint(a); 
} 

void MyPrint(int... x){ 
//Do Stuff to arguments (accessing them by its index) 
} 
+0

permet de dire que MyPrint est une fonction surchargée. Je veux être en mesure de convertir mon tableau en paramètres, donc je peux appeler une méthode surchargée spécifique –

+0

ne l'obtenez pas ... pourriez-vous expliquer un peu plus? – Cristian

+0

a modifié ma question ci-dessus –

0

En résumé, ce n'est vraiment pas possible. La seule façon de prendre un nombre variable d'arguments est avec la construction int...x. Sinon, vous devez déterminer combien d'éléments sont dans a et ensuite déterminer lequel appeler.

if (a.length == 2) { 
    MyPrint(a[0], a[1]); 
} 
else if (a.length == 3) { 
    MyPrint(a[0], a[1], a[2]); 
} 
// etc 
2

Il serait extrêmement étrange de faire ce que vous essayez de faire. Si vous cherchez un moyen général de le faire, vous devez creuser dans la réflexion (java.lang.reflect). Si vous avez vraiment un tableau/collection avec 1, 2 ou 3 ints et que vous voulez appeler une méthode différente basée sur cela, alors écrivez simplement une méthode qui calcule le nombre de valeurs dans le "thing" et appelle la méthode appropriée.

Pouvez-vous nous dire pourquoi vous voulez faire cela?

Edit:

Code pour la manière codée en dur:

public class Main 
{ 
    public static void main(String[] args) 
    { 
     final Main main; 

     main = new Main(); 
     main.callFoo(new int[] {1}); 
     main.callFoo(new int[] {1, 2}); 
     main.callFoo(new int[] {1, 2, 3}); 
    } 

    private void callFoo(final int[] values) 
    { 
     if(values.length == 1) 
     { 
      foo(values[0]); 
     } 
     else if(values.length == 2) 
     { 
      foo(values[0], values[1]); 
     } 
     else if(values.length == 3) 
     { 
      foo(values[0], values[1], values[2]); 
     } 
     else 
     { 
      throw new Error("too many values: " + values.length); 
     } 
    } 

    private void foo(int a) 
    { 
     System.out.println("foo(" + a + ")"); 
    } 

    private void foo(int a, int b) 
    { 
     System.out.println("foo(" + a + ", " + b + ")"); 
    } 

    private void foo(int a, int b, int c) 
    { 
     System.out.println("foo(" + a + ", " + b + ", " + c + ")"); 
    } 
} 

Voici la version de réflexion (je ne traiterait pas les erreurs via printStackTrace, mais il est un point de départ):

public class Main 
{ 
    public static void main(String[] args) 
    { 
     final Main main; 

     main = new Main(); 
     main.callFoo(new int[] {1}); 
     main.callFoo(new int[] {1, 2}); 
     main.callFoo(new int[] {1, 2, 3}); 
    } 

    private void callFoo(final int[] values) 
    { 
     final Class[] parameters; 

     parameters = new Class[values.length]; 

     for(int i = 0; i < parameters.length; i++) 
     { 
      parameters[i] = int.class; 
     } 

     try 
     { 
      final Method method; 
      final Object[] args; 

      method = Main.class.getDeclaredMethod("foo", parameters); 
      args = new Object[values.length]; 

      for(int i = 0; i < args.length; i++) 
      { 
       args[i] = Integer.valueOf(values[i]); 
      } 

      method.invoke(this, args); 
     } 
     catch(final IllegalAccessException ex) 
     { 
      ex.printStackTrace(); 
     } 
     catch(final IllegalArgumentException ex) 
     { 
      ex.printStackTrace(); 
     } 
     catch(final InvocationTargetException ex) 
     { 
      ex.printStackTrace(); 
     } 
     catch(final NoSuchMethodException ex) 
     { 
      ex.printStackTrace(); 
     } 
     catch(final SecurityException ex) 
     { 
      ex.printStackTrace(); 
     } 
    } 

    private void foo(int a) 
    { 
     System.out.println("foo(" + a + ")"); 
    } 

    private void foo(int a, int b) 
    { 
     System.out.println("foo(" + a + ", " + b + ")"); 
    } 

    private void foo(int a, int b, int c) 
    { 
     System.out.println("foo(" + a + ", " + b + ", " + c + ")"); 
    } 
} 

Modifier ... dernier - celui-ci fonctionnera pour n'importe quelle méthode (vous lui passez le nom de la méthode). Ceci est la moins sûre sur le tas - une faute de frappe dans le nom peut gâcher votre journée :-)

public class Main 
{ 
    public static void main(String[] args) 
    { 
     final Main main; 

     main = new Main(); 
     main.call("foo", new int[] {1}); 
     main.call("foo", new int[] {1, 2}); 
     main.call("foo", new int[] {1, 2, 3}); 
     main.call("bar", new int[] {1}); 
     main.call("bar", new int[] {1, 2}); 
     main.call("bar", new int[] {1, 2, 3}); 
    } 

    private void call(final String methodName, 
         final int[] values) 
    { 
     final Class[] parameters; 

     parameters = new Class[values.length]; 

     for(int i = 0; i < parameters.length; i++) 
     { 
      parameters[i] = int.class; 
     } 

     try 
     { 
      final Method method; 
      final Object[] args; 

      method = Main.class.getDeclaredMethod(methodName, parameters); 
      args = new Object[values.length]; 

      for(int i = 0; i < args.length; i++) 
      { 
       args[i] = Integer.valueOf(values[i]); 
      } 

      method.invoke(this, args); 
     } 
     catch(final IllegalAccessException ex) 
     { 
      ex.printStackTrace(); 
     } 
     catch(final IllegalArgumentException ex) 
     { 
      ex.printStackTrace(); 
     } 
     catch(final InvocationTargetException ex) 
     { 
      ex.printStackTrace(); 
     } 
     catch(final NoSuchMethodException ex) 
     { 
      ex.printStackTrace(); 
     } 
     catch(final SecurityException ex) 
     { 
      ex.printStackTrace(); 
     } 
    } 

    private void foo(int a) 
    { 
     System.out.println("foo(" + a + ")"); 
    } 

    private void foo(int a, int b) 
    { 
     System.out.println("foo(" + a + ", " + b + ")"); 
    } 

    private void foo(int a, int b, int c) 
    { 
     System.out.println("foo(" + a + ", " + b + ", " + c + ")"); 
    } 

    private void bar(int a) 
    { 
     System.out.println("bar(" + a + ")"); 
    } 

    private void bar(int a, int b) 
    { 
     System.out.println("bar(" + a + ", " + b + ")"); 
    } 

    private void bar(int a, int b, int c) 
    { 
     System.out.println("bar(" + a + ", " + b + ", " + c + ")"); 
    } 
} 
+0

Les méthodes que j'appelle font partie d'une bibliothèque de distribution de maths. Theres comme 20 fonctions différentes et environ 3-4 surchargés pour chacun. Je voulais juste éviter d'avoir à faire des instructions if/switch massives pour comprendre chacune d'elles –

+0

Eh bien, je vous ai donné le code de deux façons ... Je suggérerais d'utiliser la version non-réflexion et de faire des méthodes "callXXX" l'oeuvre. Si vous ne voulez vraiment pas faire cela, utilisez le reflet. – TofuBeer

+0

Merci pour cela. Je jette un coup d'oeil aux deux exemples maintenant –