2011-09-30 81 views
59

Ví dụ, số String.format() của Java hỗ trợ một số lượng đối số thay đổi.Làm cách nào để tạo phương thức Java chấp nhận số lượng đối số thay đổi?

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

Làm cách nào để tôi có thể thực hiện chức năng của riêng mình chấp nhận một số đối số thay đổi?


theo dõi câu hỏi:

Tôi thực sự cố gắng để làm một phím tắt tiện lợi cho việc này:

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

Vì vậy mà tôi có thể gọi nó như là một cái gì đó ít tiết như thế này:

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

Tôi làm cách nào để đạt được điều này?

+0

Tôi không quen thuộc với cú pháp '(đối tượng cuối cùng ... đối số)', vì vậy tôi không chắc chắn bạn đang nhận được gì. –

Trả lời

99

Bạn có thể viết một phương pháp tiện theo dõi:

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

Nhưng như bạn thấy, bạn đã chỉ đơn giản là chỉ cần đổi tên format (hoặc printf).

Đây là cách bạn có thể sử dụng nó:

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 

Note có cũng là tương tự System.out.printf phương pháp mà hành xử theo cùng một cách, nhưng nếu bạn peek tại việc thực hiện, printf chỉ gọi format, vì vậy bạn cũng có thể sử dụng format trực tiếp.

+2

Vì vậy, điều này đã được triển khai? Tôi có nên sử dụng nó như là 'PrintStream.print (" ... ", a, b, c)'? Cung cấp một ví dụ sử dụng và tôi sẽ đánh dấu nó là câu trả lời được chấp nhận :) –

+1

Đúng, điều này đã được cung cấp trên 'PrintStream', mà' System.out' xảy ra là: D Bạn có thể sử dụng 'printf' hoặc' format' –

+0

@ NateW. Làm thế nào nó khác với 'private void printScores (Player [] players) {}'? –

24

này được gọi là varargs thấy liên kết here để biết thêm chi tiết

Trong phiên bản java qua, một phương pháp mà mất một số tùy ý các giá trị đòi hỏi bạn phải tạo một mảng và đưa các giá trị vào mảng trước khi gọi phương pháp. Ví dụ, đây là cách người ta sử dụng lớp MessageFormat để định dạng một thông điệp:

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

Nó vẫn là sự thật mà nhiều đối số phải được thông qua trong một mảng, nhưng varargs tính năng automates và giấu quá trình này. Hơn nữa, nó tương thích với các API từ trước. Vì vậy, ví dụ, phương pháp MessageFormat.format nay đã có tuyên bố này:

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

+1 vì rất giáo dục. –

+0

Cảm ơn MessageFormat ref – fionbio

8

Hãy xem hướng dẫn Java trên varargs.

Bạn có thể tạo phương thức như được hiển thị bên dưới. Chỉ cần gọi System.out.printf thay vì System.out.println(String.format(....

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

Hoặc, bạn chỉ có thể sử dụng static import nếu bạn muốn nhập ít nhất có thể.Sau đó, bạn không cần phải tạo ra phương pháp riêng của bạn:

import static java.lang.System.out; 

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

+1 cho đề xuất nhập tĩnh –

2

Sau đây sẽ tạo ra một bộ chiều dài biến của các đối số của các loại chuỗi:

Bạn có thể sau đó tham khảo arg2 như một mảng Strings. Đây là một tính năng mới trong Java 5.

0

Đối số biến phải là tham số cuối cùng được xác định trong khai báo hàm của bạn. Nếu bạn cố gắng chỉ định một tham số khác sau các đối số biến, trình biên dịch sẽ phàn nàn vì không có cách nào để xác định có bao nhiêu tham số thực sự thuộc về đối số biến.

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

Đây chỉ là phần mở rộng cho các câu trả lời được cung cấp ở trên.

  1. Chỉ có thể có một đối số biến trong phương thức.
  2. Đối số biến (varargs) phải là đối số cuối cùng.

Giải thích rõ ràng here và các quy tắc để theo dõi sử dụng Đối số biến.

+3

Trong khi liên kết này có thể trả lời câu hỏi, tốt hơn nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi. –

+1

Vâng bạn đang viết. Tôi chỉ cung cấp liên kết vì đã có câu trả lời chính xác và tốt, ngoại trừ các quy tắc bị thiếu. –

-2

Bạn có thể chuyển tất cả các giá trị kiểu tương tự trong hàm trong khi gọi nó. Trong hàm định nghĩa đặt mảng sao cho tất cả các giá trị được truyền có thể là được thu thập trong mảng đó. ví dụ: .

static void demo (String ... stringArray) { 
    your code goes here where read the array stringArray 
} 
Các vấn đề liên quan