2011-09-30 11 views
59

Por ejemplo, el propio String.format() de Java admite una cantidad variable de argumentos.¿Cómo crear un método Java que acepte una cantidad variable de argumentos?

String.format("Hello %s! ABC %d!", "World", 123); 
//=> Hello World! ABC 123! 

¿Cómo puedo hacer mi propia función que acepta una cantidad variable de argumentos?


Seguimiento pregunta:

Realmente estoy tratando de hacer un acceso directo comodidad para esto:

System.out.println(String.format("...", a, b, c)); 

De modo que pueda llamar como algo menos detallado de esta manera:

print("...", a, b, c); 

¿Cómo puedo lograr esto?

+0

No estaba familiarizado con la sintaxis '(final Object ... arguments)', así que no estoy seguro de a qué te refieres. –

Respuesta

99

Se puede escribir un método de conveniencia:

public PrintStream print(String format, Object... arguments) { 
    return System.out.format(format, arguments); 
} 

Pero como se puede ver, usted ha cambiado el nombre simplemente format (o printf).

Así es como se podría utilizar:

private void printScores(Player... players) { 
    for (int i = 0; i < players.length; ++i) { 
     Player player = players[i]; 
     String name = player.getName(); 
     int score = player.getScore(); 
     // Print name and score followed by a newline 
     System.out.format("%s: %d%n", name, score); 
    } 
} 

// Print a single player, 3 players, and all players 
printScores(player1); 
System.out.println(); 
printScores(player2, player3, player4); 
System.out.println(); 
printScores(playersArray); 

// Output 
Abe: 11 

Bob: 22 
Cal: 33 
Dan: 44 

Abe: 11 
Bob: 22 
Cal: 33 
Dan: 44 

Nota también está el parecido System.out.printf método que se comporta de la misma manera, pero si usted se asoma en la aplicación, printf sólo llama format, por lo que también podría utilizar format directamente.

+2

¿Esto ya se ha implementado? ¿Debería usarlo como 'PrintStream.print (" ... ", a, b, c)'? Proporcione un ejemplo de uso y lo marcaré como respuesta aceptada :) –

+1

Sí, esto ya se proporciona en 'PrintStream', que' System.out' pasa a ser: D Puede usar 'printf' o' format' –

+0

@ NateW. ¿Cómo difiere de 'printecores void privado (jugador [] jugadores) {}'? –

24

Esto se conoce como varargs ver el enlace here para más detalles

En las versiones de Java anteriores, un método que tuvo un número arbitrario de valores que se requieren para crear una matriz y poner los valores en la matriz antes de invocar el método. Por ejemplo, aquí es cómo se utiliza la clase MessageFormat para dar formato a un mensaje:

Object[] arguments = { 
    new Integer(7), 
    new Date(), 
    "a disturbance in the Force" 
}; 
    String result = MessageFormat.format(
     "At {1,time} on {1,date}, there was {2} on planet " 
     + "{0,number,integer}.", arguments); 

Todavía es cierto que varios argumentos deben ser pasados ​​en una matriz, pero los varargs característica automatiza y oculta el proceso. Además, es compatible con las API preexistentes. Así, por ejemplo, el método MessageFormat.format ahora con esta declaración:

public static String format(String pattern, 
          Object... arguments); 
+3

+1 por ser muy educativo. –

+0

Gracias por MessageFormat ref – fionbio

8

Echa un vistazo a la guía de Java en varargs.

Puede crear un método como se muestra a continuación. Simplemente llame al System.out.printf en lugar de System.out.println(String.format(....

public static void print(String format, Object... args) { 
    System.out.printf(format, args); 
} 

Como alternativa, puede simplemente usar un static import si desea escribir lo menos posible.Entonces usted no tiene que crear su propio método:

import static java.lang.System.out; 

out.printf("Numer of apples: %d", 10); 
+0

+1 para la recomendación de importación estática –

2

A continuación se va a crear un conjunto de argumentos de longitud variable del tipo de cadena:

A continuación, puede referirse a arg2 como una conjunto de cadenas. Esta es una nueva característica en Java 5.

0

Los argumentos variables deben ser el último de los parámetros especificados en la declaración de su función. Si intenta especificar otro parámetro después de los argumentos de la variable, el compilador se quejará ya que no hay manera de determinar cuántos de los parámetros realmente pertenecen al argumento de la variable.

void print(final String format, final String... arguments) { 
    System.out.format(format, arguments); 
} 
3

Esto es solo una extensión de las respuestas proporcionadas anteriormente.

  1. Solo puede haber un argumento variable en el método.
  2. El argumento variable (varargs) debe ser el último argumento.

explicado claramente here y las reglas a seguir para utilizar de argumentos variable.

+3

Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. –

+1

Sí, estás escribiendo. Proporcioné solo un enlace porque ya hay respuestas correctas y buenas, excepto que faltan reglas. –

-2

Puede pasar todos los valores de tipo similares en la función al llamarlo. En la función definición ponga matriz para que todos los valores pasados ​​puedan ser recopilados en esa matriz. p. .

static void demo (String ... stringArray) { 
    your code goes here where read the array stringArray 
} 
Cuestiones relacionadas