2011-10-15 82 views
3

我們有方法,看起來像這樣:的Java格式陣列(使用格式化類)

public String getCommandString(Object...args) { 
    return this.code + " " + String.format(this.pattern, args); 
} 

this.code:intthis.pattern:String

這種方法通常被稱爲是這樣的:

// cmd.code = 20 
// cmd.pattern = "%1$s = %2$d" 
String str = cmd.getCommandString("foo", 3); // -> "20 foo = 3" 

等字符串模式(這是一個非常簡單的基於文本的服務器 - 客戶端程序)

現在,是有可能的模式考慮到可變數目的參數,如

// cmd.code = 20 
// cmd.pattern = ??? 
String s1 = cmd.getCommandString("a", "b", "c");    // -> 20 a b c 
String s2 = cmd.getCommandString("Hello", "world");   // -> 20 Hello world 
String s3 = cmd.getCommandString("1", "2, "3", "4", "5", "6"); // -> 20 1 2 3 4 5 6 

假設也許每個參數都是相同類型(字符串)?或者我必須重寫該方法並手動設置字符串的格式?更具體地說,我正在尋找一個通用字符串模式來格式化可變數量的參數(相同類型)。我記得在C中做這樣的事情,但這在Java中可能嗎?

+0

我不明白這一點。你不能只是連接一切嗎? (如果你有一個模式,只需在模式中運行每個字符串並連接結果) – NullUserException

+0

是的,對於引用的特定示例,調用'StringUtils.join(args,'')'是要走的路,但我認爲OP就是以此爲例。 :) –

+0

我知道第三方類操作對象(如'StringUtils'),但通常先轉到java。*'包,如果可以的話。 –

回答

3

如果我理解正確,您所要求的功能不存在。下面是從Formatter類的Javadoc部分:

格式說明符可以通過三種方式引用參數:在格式說明中包含的參數指標

明確的索引使用。參數索引是一個十進制整數,指示參數列表中參數的位置。第一個參數是由「1 $」引用的,第二個參數是「2 $」等。一個參數可能被多次引用。例如:

formatter.format(「%4 $ s%3 $ s%2 $ s%1 $ s%4 $ s%3 $ s%2 $ s%1 $ s」, 「a」 , 「b」, 「C」, 「d」) // - > 「dcbadcba」

相對索引用於當格式說明含有這引起爭論一個 '<'( '\ u003c')標誌先前的格式說明符將被重新使用。如果沒有先前的參數,則拋出MissingFormatArgumentException。

formatter.format(「%S%S%‘ABBB’ //‘c’和‘d’被忽略,因爲它們沒有被引用

普通索引用於當格式說明既不包含一個參數索引也不是'<'標誌,每個使用普通索引的格式說明符都被分配一個連續的隱式索引到參數列表中,該索引與顯式索引或相對索引所使用的索引無關。

formatter.format(「%s%s %s「,」a「,」b「,」c「,」d「) // - >」abcd「

有可能有一個使用所有形式的索引,例如一個格式字符串:

formatter.format(「%2 $ S%S% 」BAAB「 // 」c「 和 」d「 是忽略,因爲它們未被引用

參數的最大數量受Java虛擬機規範定義的Java數組的最大維數限制。如果參數索引不符合可用參數,則會拋出MissingFormatArgumentException。

如果有更多的參數比格式說明符,額外的參數被忽略。

你所要求的是一種構建模式的方法,它將接受任意數量的參數並使用tham all。問題是Formatter類只能顯式地,相對地或正常地將格式說明符與參數相關聯。在每種情況下,形式說明符的數量是固定的。沒有構造可以在其中重複或循環格式說明符。相關的技術看起來很有前途,但是沒有辦法嵌套或循環它。

+0

我一直希望有一些漂亮的無證技巧,但看起來像這樣行不通。那麼我會做出適當的使用其他方法。 –

-1

使用此

public String getCommandString(Object...args) { 
    // Want to have a "-" if args are not given 
    return this.code + " " + args != null && args.length > 0 
      ? Arrays.stream(args).map(o -> o.toString()).collect(Collectors.joining(" + ")) : "-"; 
}