例如:
有一个字符串列表(ArrayList shopList
,并输出到 String() 像这样
[bread, sugar, butter]
现在我需要将此列表转换为 Oracle IN 条件,以便它变为:
('bread', 'sugar', 'butter')
我使用
String shopListString= "(".concat(shopList.toString().replaceAll("[\s\[\]]", "'")).concat(")");
但首先,我尽量避免 concat 但单独使用正则表达式,它也只是输出以下错误:
('bread,'sugar,'butter')
只有最后一项带有开头'
下面是
一个Java 8示例:
// example list
List<String> myList = new ArrayList<String>(){
{add("bread");add("sugar");add("butter");}
};
// result
// initializing StringBuilder with starting "("
String oracle = myList
.stream()
// collecting as "," separated CharSequence, enclosed in "(" and ")"
.collect(Collectors.joining("','", "('", "')"));
System.out.println(oracle);
输出
('bread','sugar','butter')
笔记
- 这里的想法是使用(隐藏)迭代,而不是解析和转换
List
的String
表示。 - 在比Java 8更早的Java习语中,这需要更多的代码,以及一些"命令式"式的丑陋(参见Casimir et Hippolyte的有效答案)。
- 感谢吉皮尔提供大大改进的解决方案。
- 正如安德烈亚斯所提到的,要小心未经净化的价值观。您可能希望构建一个格式
String
,其中包含与List
元素一样多的占位符,然后改用PreparedStatement
。
有
一个简单的方法基于@Keppil:
"('"+ StringUtils.join(myList, "','") + "')"
这是原点答案使用group
变量替换:
"("+ StringUtils.join(myList, ",").replaceAll("(\w+)", "'$1'") + ")"
您可以使用StringUtils
join
字符串和环绕group
变量来替换单词。
遍历arrayList元素并使用stringBuilder。
StringBuilder sb = new StringBuilder("('");
int lastIndex = myList.size() - 1;
for (int i=0; i < lastIndex; i++) {
sb.append(myList.get(i));
sb.append("','");
}
sb.append(myList.get(lastIndex));
sb.append("')");
注意:我假设 arrayList 不为空。
StringBuffer sb = new StringBuffer("(");
//assume this list is populated
List<String> str = new ArrayList<String>();
for (int i =0;i<str.size();i++) {
String temp = "'" + str.get(i) + "'";
sb.append(temp);
if(i != (str.size() -1)) {
sb.append(",");
}
}
sb.append(")");
System.out.println(sb.toString());