从字符串数组中删除逗号

3
我希望执行类似于以下的查询: select ID from "xyz_DB"."test" where user in ('a','b')
相应的代码如下:
String s="(";
for(String user:selUsers){
    s+= " ' " + user + " ', ";
}
s+=")";

从test表中选择ID,其中userId在s中。

以下代码将s的值形成为('a','b',),我想删除数组末尾的逗号,该如何操作?

10个回答

4
这里有一种方法来实现这个功能:
String s = "(";
boolean first = true;
for(String user : selUsers){
    if (first) {
        first = false;
    } else {
        s += ", ";
    }
    s += " ' " + user + " '";
}
s += ")";

但是如果涉及循环,使用StringBuilder拼接字符串会更加高效。

StringBuilder sb = new StringBuilder("(");
boolean first = true;
for(String user : selUsers){
    if (first) {
        first = false;
    } else {
        sb.append(", ");
    }
    sb.append(" ' ").append(user).append(" '");
}
sb.append(")");
String s = sb.toString();

3
这很管用。
String s = "";
for(String user : selUsers)
    s += ", '" + user + "'";

if (selUsers.size() > 0)
    s = s.substring(2);

s = "(" + s + ")";

但是,有几点需要注意:

  • 当像这样连接字符串时,建议使用StringBuilderappend来处理。
  • 如果这是SQL查询的一部分,则可能要“消毒”用户名称。请参见xkcd:Exploits of a Mom了解详细说明。

为了好玩,这是Stephen C的答案的变体:

StringBuilder sb = new StringBuilder("(");
boolean first = true;
for(String user : selUsers){
    if (!first || (first = false))
        sb.append(", ");
    sb.append('\'').append(user).append('\'');
}
sb.append(')');

你甚至可以像这样循环它 :-)
for(String user : selUsers)
    sb.append(!first || (first=false) ? ", \'" : "\'").append(user).append('\'');

1
使用“旧式”循环,其中您拥有索引,然后在除最后一个用户名外的每个用户名上添加逗号:
    String[] selUsers = {"a", "b", "c"};
    String s="("; 
    for(int i = 0; i < selUsers.length; i++){
        s+= " ' " + selUsers[i] + " ' ";  
        if(i < selUsers.length -1){
            s +=" , ";
        }
    }
    s+=")";

但是正如其他人已经提到的,当连接字符串时,请使用StringBuffer:

    String[] selUsers = {"a", "b", "c"};
    StringBuffer s = new StringBuffer("("); 
    for(int i = 0; i < selUsers.length; i++){
        s.append(" ' " + selUsers[i] + " ' ");  
        if(i < selUsers.length -1){
            s.append(" , ");
        }
    }
    s.append(")");

1
在添加尾随的 ')' 之前,如果字符串的最后一个字符是逗号,我会将其去掉,或者只需用右括号替换尾随的逗号 - 在伪代码中,类似于:
if s.last == ',' then
  s = s.left(s.length() - 1);
end if;

s = s + ')';

或者

if s.last == ',' then
  s.last = ')';
else
  s = s + ')';
end if;

分享并享受。


1

0

Java 1.4+

s = s.replaceFirst("\\, \\)$", ")");

编辑:我忘记在括号前加空格了


0

我完全支持Stephen C的答案 - 那也是我想建议的:简单地避免添加额外的逗号。

但在你的特殊情况下,以下方法也应该可以:

s = s.replace(", \\)", ")");

它只是用单个括号")"替换子字符串", )"


0

StringBuilder有一个非常好的append(int)重载。

String [] array = {"1","2","3" ...}; 
StringBuilder builder = new StringBuilder(); 
 builder.append(s + "( ")
for(String i : array) 
{ 
    if(builder.length() != 0) 
        builder.append(","); 
    builder.append(i); 
} 
builder.append(" )")

回答毫不羞耻地从这里复制而来


0
我会这样做:s+= " ,'" + user + "'";(在值之前放置逗号),并在循环中添加一个计数器,如果计数器为1(或0,取决于从哪里开始计数),则只需执行s = "'" + user + "'";。与此同时。

@sarah,我认为我的回答澄清了他的建议。 - aioobe
正如aioobe所说,可以查看他的答案获取一些代码。我希望你能自己思考,而不是给你预先准备好的代码,这样你才能真正理解你正在做什么。 - oezi

0

(注:我不是Java专家,所以语法可能有误-如果有的话请见谅)。

如果selUsers是一个数组,为什么不这样做:

selUsers.join(',');

这应该可以满足你的需求。

编辑:

看起来我错了 - 我以为Java内置了这个功能。不过似乎Apache项目有一个可以实现我想要的功能。请查看这个SO答案:Java:类似于PHP join() 的数组函数?


Java中的数组或集合没有join方法。 - Stephen C
是的,Java是一种纯面向对象的语言,功能上很少有函数式编程的能力,其中join就是其中之一。 - Esko
@Esko - 不,那不是原因。join方法与面向对象编程无关。我猜它不被支持的真正原因是为了保持数组的简单性。 - Stephen C
@Stephen join 是应用于列表的操作,而不是列表的属性。面向对象可以被视为基于谁拥有什么来封装,由于操作是实现细节而不是属性,因此它们并不完全适合于面向对象设计的库,例如 Java Collections。请注意,我并不是说这会是一件特别好的事情... - Esko
@Esko - 哦,我明白你的意思了。但即使如此,没有join的真正原因是"他们"认为它不够重要。Java离纯粹的面向对象语言还有很长的路要走,如果非面向对象的辅助方法/类有用的话,"他们"也毫不犹豫地添加进去。顺便说一句:把join称为"函数能力"有点牵强。它只会成为Arrays中的另一个方法而已。实际上,第二个原因是他们必须为每种原始类型添加重载...这是因为Java处理原始类型的方式是非面向对象的! - Stephen C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接