2011-09-30 5 views
59

たとえば、Java独自のString.format()は、可変数の引数をサポートしています。可変数の引数を受け入れるJavaメソッドを作成するには?

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

可変数の引数を受け入れる独自の関数を作成するにはどうすればよいですか?


フォローアップの質問:私はこのようなそれほど冗長なものとしてそれを呼び出すことができるように

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

::私は本当にこのための便利なショートカットを作成しようとしている

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

どうすればこの問題を解決できますか?

+0

私は '(最終的なObject ... arguments) '構文に慣れていないので、あなたは何を得ているのか分かりません。 –

答えて

99

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

しかし、あなたが見ることができるように、あなたは単純にformatと改名しました(またはprintf)。ここで

は、あなたがそれを使用することができます方法は次のとおりです。

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 

注意が同じように動作し同様のSystem.out.printf方法もありますが、あなたは、実装で覗いた場合、printfはちょうどformatを呼び出すので、あなたにも使用することがあります直接format

+2

これは既に実装されていますか?私は 'PrintStream.print(" ... "、a、b、c)'としてそれを使うべきですか? –

+1

これは 'PrintStream'にすでに用意されています。' System.out'は次のようになります:D 'printf'または' format'のどちらかを使用できます –

+0

@ NateW。 'private void printScores(Player [] players){}'とどう違うのですか? –

24

これは、より詳細過去のJavaリリースで

、配列を作成し、前の呼び出しに配列に値を置くためにあなたを必要とされる値の任意の数を取った方法のためのリンクhereを参照してください可変引数として知られていますメソッド。例えば、ここでは1がメッセージをフォーマットするのMessageFormatクラスを使用する方法である:

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); 

複数の引数が配列で渡されなければならないことはまだ本当ですが、可変引数は、自動化を特長とプロセスを隠します。さらに、既存のAPIと上位互換性があります。したがって、たとえば、MessageFormat.format方法について、この宣言を持っている:あなたは便利なメソッド書くことができ

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

+1は非常に教育的です。 –

+0

MessageFormatの参考にしてください – fionbio

8

varargs上のJavaガイドを見てみましょう。

以下のようにメソッドを作成できます。 System.out.println(String.format(...の代わりにSystem.out.printfに電話するだけです。また

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

あなたはできるだけを入力したい場合は、あなただけstatic importを使用することができます。次に、あなた自身のメソッドを作成する必要はありません。

import static java.lang.System.out; 

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

静的インポート推奨の場合は+1 –

2

以下は、文字列の型の引数の可変長セットが作成されます:あなたは、その後としてarg2を参照することができ

をストリングの配列。これはJava 5の新機能です。

0

可変引数は、関数宣言で指定された最後のパラメータでなければなりません。変数引数の後に別のパラメータを指定しようとすると、変数引数に実際に含まれているパラメータの数を判断する方法がないため、コンパイラは不平を言います。

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

これは上記の回答の拡張です。

  1. このメソッドには1つの可変引数しか指定できません。
  2. 可変引数(varargs)は最後の引数でなければなりません。

は明らかに可変引数を使用するように従うことhereとルールを説明しました。

+3

このリンクは質問に答えるかもしれませんが、回答の重要な部分をここに含めて参考にしてください。リンクされたページが変更された場合、リンクのみの回答は無効になります。 –

+1

あなたは書きました。私は、ルールが欠落していることを除いて、すでに正しく正しい答えがあるので、リンクのみを提供しました。 –

-2

関数内のすべての同様の型の値を呼び出す際に渡すことができます。 関数の定義には、の配列を渡して、渡されたすべての値がその配列に収集されたになるようにします。例: 。

static void demo (String ... stringArray) { 
    your code goes here where read the array stringArray 
} 
関連する問題