我需要根据参数列表构建模式字符串。如果参数为"foo", "bar", "data"
,则模式应为:"?, ?, ?"
我的代码是:
List<String> args;
...
for(String s : args) {
pattern += "?,";
}
pattern = pattern.substring(0, pattern.length()-1);
它工作正常,唯一的问题是,s
没有使用,似乎代码有点脏。
对此有何改进?
我希望像:
for(args.size()) {
...
}
但显然没有..
答案 0 :(得分:2)
我通常用Haskell / Python风格来做 - 用“_”命名。这样很明显,变量是故意未使用的:
int n = 0;
for (final Object _ : iterable) { ++n; }
IntelliJ仍然抱怨,但是:)
答案 1 :(得分:0)
为什么不使用
for (int i = 0; i < args.size(); i++) {
...
}
如果要使用迭代的内容,可以使用每个块。例如,如果您知道要使用args中存在的每个String值,则使用for (String s : args)
。它看起来像这里,你不需要实际的字符串。
答案 2 :(得分:0)
您可以使用for each loop
:
for (String s : args)
或者您可以在条件中使用班级for loop
:
for (int s = 0, s < args.size(); s++)
但不管怎样,有一个“未使用”的变量,除了实际上未使用;它被用作for loop
中的计数条件。只有那两种for loop
样式。
要回答您的问题,否没有“改进”,尽管不需要“改进”。
答案 3 :(得分: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时。
答案 4 :(得分:0)
如果您有Guava,可以尝试将Joiner与Collections.nCopies合并:
Joiner.on(", ").join(Collections.nCopies(args.size(), "?"));
答案 5 :(得分:0)
您正在寻找的是一个被称为“加入”的概念。在更强大的语言中,例如Groovy,它可以在标准库中使用,你可以编写,例如args.join(',')
来获得你想要的东西。使用Java,您可以从StringUtils.join(args, ",")
(每个Java项目中应包含的库)中使用Commons Lang获得类似的效果。
更新:我显然错过了原来答案的重要部分。首先需要将字符串列表转换为问号。 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>("?")),
",");
相当不太可读......
答案 6 :(得分:0)
另一个选择是使用Java Stream的api。很整洁。
String output = args
.stream()
.map( string -> "?" ) // transform each string into a ?
.collect( Collectors.joining( "," ) ); // collect and join on ,