-1

嗨,我需要能够用设置索引处的字符串替换一个字符。

例子:

"hello ? would you like a ? from ?"

这是我想使用的方法:

query.bindValue(0,"Mr Boo");
query.bindValue(1,"cake");
query.bindValue(2,"Mr Foo");

我想要的输出:

"hello Mr Boo would you like a cake from Mr Foo"

我需要把它按任何顺序排列,结果是一样的:

query.bindValue(2,"Mr Foo");
query.bindValue(0,"Mr Boo");
query.bindValue(1,"cake");

回答:

public class DBQuery {

private String querystr;

Map<Integer,String> map = new HashMap<>();

public void prepare(String str){
    this.querystr = str;
}

public void bindValue(int num, String value){
    map.put(num, value);
}

public void execute(){

    java.util.List<Integer> keys = new ArrayList<>(map.keySet()); 
    Collections.sort(keys);

    for(Integer key : keys){
        querystr = querystr.replaceFirst("\\?", map.get(key));
    }

    System.out.println(querystr);
}
}
4

3 回答 3

4

这会将您的输入字符串转换为所需的输出:

str = String.format(str.replace("?", "%s"), "Mr Boo", "cake", "Mr Foo");
于 2013-10-26T13:46:38.917 回答
0

您可以使用 a 来实现它Mapregex如下所示:

Map<Integer,String> map = new HashMap<>(); //this map contains the values
map.put(3, "Mr Foo");
map.put(0, "Mr Boo");
map.put(1, "cake");
map.put(2, "cookie");

String query = "hello ? would you like a ? or a ? from ?"; //this is the query

Matcher matcher = Pattern.compile("\\?").matcher(query);
int index = 0;
StringBuffer sb = new StringBuffer();
while(matcher.find()){ 
    matcher.appendReplacement(sb, map.get(index));
    index++;
}
matcher.appendTail(sb);
System.out.println(sb.toString()); // this will display the query as you want
于 2013-10-26T13:52:54.597 回答
0

如果您有一种方法可以在字符串中找到第 n 个?并将其替换为一个单词,那么主要问题是。例如,第二个? (id = 1)你将替换为“蛋糕”,当你想赶上第三个? (id = 2)时,由于第二个?已经被蛋糕替换,现在这将是“新的”第二个而不是第三个。

因此,最好的方法是通过?into拆分您的查询String Arraystatic如果您想要绑定id = 1,则选择array[1]并附加您想要的字符串,如果您想要id=n选择array[n]并附加您的字符串。

最后,追加数组的所有元素,查询就完成了。

就像是

static String[] arrayQuery =  "hello ? would you like a ? from ?".split("?");

public void fillQuery(int position, String word) {
   arrayQuery[position] = arrayQuery[position]+word);
}

最后,要返回查询,遍历数组并返回一个String包含所有元素的数组

于 2013-10-26T13:46:21.353 回答