相当于C';Java中的vsscanf()

相当于C';Java中的vsscanf(),java,parsing,variadic-functions,scanf,Java,Parsing,Variadic Functions,Scanf,我需要一个等价于Java中C的vsscanf()。更详细地说,我这里有: private void parseString(String parseMe, String format, Object[] args) { // something like: vsscanf(parseMe, format, args); } 请注意,我确实读过,因此可以很容易地从那里完成。但我问自己,是否有比用for循环填充args更优雅的解决方案 另外,如果解决方案也允许使用varargs而不是数组,

我需要一个等价于Java中C的
vsscanf()
。更详细地说,我这里有:

private void parseString(String parseMe, String format, Object[] args) {
    // something like: vsscanf(parseMe, format, args);
}
请注意,我确实读过,因此可以很容易地从那里完成。但我问自己,是否有比用for循环填充args更优雅的解决方案

另外,如果解决方案也允许使用varargs而不是数组,那就太好了。见下文

parseString(str, format, x, y, z);

您可以使用
java.text.MessageFormat
。例如:

public static void main(String[] args) throws ParseException {
    String input="hello 1:2.3.4";
    MessageFormat form = new MessageFormat("{0} {1,number}:{2,number,integer}.{3,number}");
    Object[] data = form.parse(input);
    for(Object o : data) {
        System.out.println(o.getClass()+" : "+o.toString());
    }
}
它产生输出:

class java.lang.String : hello
class java.lang.Long : 1
class java.lang.Long : 2
class java.lang.Double : 3.4

当然,该格式没有scanf使用的格式紧凑,但它是现成的Java。

@HovercraftFullOfEels我想扫描而不是打印。有些混淆?考虑到Java的按值传递引用语义,这不太可能。此外,您被迫执行的强制转换会带来比scanf语法(与例如
扫描仪
相反)所能保存的更尴尬的局面。@LouisWasserman尴尬?在这种情况下,这意味着什么?唯一可能的方法是采用
对象[]
——而不是varargs——然后在该数组中显式强制转换结果:
(Float)数组[0]
(String)数组[1]
(Integer)数组[2])
。我强烈地感觉到,这比仅仅做一些事情更难看,例如,
scanner.nextFloat()
scanner.next()
,以及
scanner.nextInt()
。我不知道直接的等价物。自己构建它的一种方法是使用并解析格式字符串,然后根据找到的模式使用
switch
语句调用
nextInt()
等。