2013-10-21 54 views
1

我需要根據參數列表構建模式字符串。如果參數"foo", "bar", "data",那麼模式應該是:"?, ?, ?"循環中未使用的變量

我的代碼是:

List<String> args; 
... 
for(String s : args) { 
    pattern += "?,"; 
} 
pattern = pattern.substring(0, pattern.length()-1); 

它工作得很好,唯一的問題是,不使用s,好像代碼是有點髒。

對此有何改進?

我希望是這樣的:

for(args.size()) { 
    ... 
} 

但顯然沒有..

+0

應該不會是「模式+ =‘’;」?而不是「pattern =」?,「」? –

+0

@DanP。你是對的,謝謝你指出 – Deqing

+0

Off topic:如果你添加',?'而不是'?,'並將'pattern.substring(0,pattern.length() - 1)'改爲'pattern.substring(1 )'這可能會稍微快一點,也更容易閱讀 –

回答

0

您可以使用for each loop

for (String s : args) 

或者你可以使用類for loop與條件:

for (int s = 0, s < args.size(); s++) 

但不管怎樣,有一個「未使用」變量,除了它是不是實際上未使用;它被用作for loop中的計數條件。只有這兩種for loop款式。

要回答你的問題,沒有沒有「改進」,雖然不需要「改進」。

+0

也許它沒有這樣的「改進」可用,但日食抱怨未使用的變量,這讓我感到有些懊惱。如果我在這種情況下添加@SuppressWarnings(「未使用」),是否好? – Deqing

0

爲什麼不使用 for (int i = 0; i < args.size(); i++) { ... }

如果你想利用你使用的每個塊無論你迭代的內容。例如,如果您知道要使用參數中存在的每個字符串值,則使用for (String s : args)。它看起來像這裏,你不需要實際的字符串。

+1

也許我在這裏分裂的頭髮,對於我這個經典的循環而言,每個循環都不夠簡潔。 – Deqing

0

我建議在此使用StringBuilder以及經典的for循環。

String pattern = ""; 
if (args.size() > 0) { 
    StringBuilder sb = new StringBuilder("?"); 
    for(int i = 1; i < args.size(); i++) { 
     sb.append(", ?"); 
    } 
    pattern = sb.toString(); 
} 


如果你不想使用 for環(如你所說不夠簡潔)使用 while代替:

int count; 
String pattern = ""; 
if ((count = args.size()) > 0) { 
    StringBuilder sb = new StringBuilder("?"); 
    while (count-- > 1) { 
     sb.append(", ?"); 
    } 
    pattern = sb.toString(); 
} 

而且,看到When to use StringBuilder?

在循環連接的時候 - 通常是編譯器不能自己替換StringBuilder。

+0

在這種情況下,比'String'更喜歡'StringBuilder'的任何特定原因? – Deqing

+0

@Deqing看看[何時使用StringBuilder](http://stackoverflow.com/q/4645020/1237040)和[回覆](http://stackoverflow.com/a/1532483/1237040)。此外,更新我的答案,使用'while'而不是'for',你似乎並不想要。 –

0

如果你有番石榴身邊,你可以嘗試用Collections.nCopies結合Joiner

Joiner.on(", ").join(Collections.nCopies(args.size(), "?")); 
+0

非常感謝,非常強大,儘管目前我無法在我的項目中引入'Guava'。 – Deqing

0

什麼你要找的是所謂的「加盟」的概念。在更強大的語言中,比如Groovy,它可以在標準庫中使用,你可以編寫例如args.join(',')來獲得你想要的。使用Java,您可以從Commons Lang(應該包含在每個Java項目中的庫)中獲得與StringUtils.join(args, ",")類似的效果。

更新:我明顯錯過了一個重要的部分與我原來的答案。首先需要將字符串列表變成問號。 Commons Collections是另一個應該始終包含在Java應用程序中的庫,可以讓您使用CollectionUtils.transform(args,new ConstantTransformer<String, String>("?"))。然後將結果傳遞給我最初提到的連接。當然,這在Java中變得有些笨拙,而更強制的方法可能更合適。

爲了比較起見,可以在Groovy和許多其他語言中使用類似args.collect{'?'}.join(',')的東西來解決整個問題。在Java中,與我所提到的公用事業,是雲更像是:

StringUtils.join(
    CollectionUtils.transform(args, 
           new ConstantTransformer<String, String>("?")), 
    ","); 

相當少一點可讀......

+0

感謝您介紹'加入'。但看起來它不能適用於我的情況。我想要''?,?,?「',而'join'返回'」foo,bar,data「' – Deqing

0

我通常做的是在Haskell/Python的風格 - 以「_」命名。這樣,這有點明顯,變量是故意閒置:

int n = 0; 
for (final Object _ : iterable) { ++n; } 

的IntelliJ仍然抱怨,雖然:)