相当于C';Java中的vsscanf()
我需要一个等价于Java中C的相当于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而不是数组,
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()
等。