我有一个这样的对象:
public class Person {
String name = "Any";
int age = 9001;
}
public String getName() {return this.name;}
public int getAge() {return this.age;}
有没有办法用预定义的模板打印这些数据,如下所述?
Person firstOne = new Person();
print_throw_getters("Name: $name%s Age: $age%i",firstOne);
如果不是,我可以在HashMap中转换一个Object:
public HashMap getHashMap {
HashMap test = new HashMap<String,Object>();
test.put("name",this.getName());
test.put("age",this.getAge());
return test;
}
是否有在预定义模板中按键打印值的功能,如下所示?
print_throw_keys("Name: $name%s Age: $age%i",firstOne.getHashMap());
我不想使用像printf这样的索引(“name:$ 1%s”,string),因为模板差异很大,但传入的对象类型是唯一的。
UPD:感谢您的回答,但我们的想法是会有一个包含模板列表的文件,这些模板将插入到数据中,例如:
String template1 = "Your selected Name is $name%s and selected age $age%i";
String template2 = "User: $name%s; Age: $age%i";
因此,物体本身将包含更多的吸气剂。
答案 0 :(得分:1)
Java API中没有可以执行此类操作的方法,但它很容易实现:
public static String buildMessage(Map<String, Object> data, String template) {
Pattern p = Pattern.compile("%([A-Za-z0-9_]+);");
Matcher m = p.matcher(template);
int offset = 0;
while(m.find()) {
int start = m.start(1) - 1 + offset;
int end = m.end(1) + 1 + offset;
String field = m.group(1);
String value = data.get(field).toString();
offset += -2 - field.length() + value.length();
template = template.substring(0, start) + value + template.substring(end);
}
return template;
}
然后您可以使用以下方法:
String template = "-- this is my name: %name;, and my age: %age; --";
Map<String, Object> data = new HashMap<>();
data.put("name", "Robert Smith");
data.put("age", 20);
System.out.println(buildMessage(data, template));
这个方法只是一个骨架,如果你想将它用于更严重的事情,你必须改进这个方法来执行以下操作:
答案 1 :(得分:1)
你可以使用 MapFormat
示例:
String text = "Your selected Name is {name} and selected age {age}";
HashMap test = new HashMap();
test.put("name", "Mr. X");
test.put("age", "21");
System.out.println("Example: " + MapFormat.format(text, test));
输出:
示例:您选择的姓名是X先生,选择年龄21
答案 2 :(得分:0)
只需override
toString()
个人身上的object.
方法<{1}}
in person object
@Override
public String toString() {
return "Name:"+this.name+"age:"+this.age;
}
然后使用System.out.printLn(person.toString());
答案 3 :(得分:0)
覆盖toString()函数以从对象状态打印。
示例:
@Override
public String toString() {
return "Name: "+this.getName()+" Age: "+this.getAge()";
}
并使用它:
Person p = new Person();
...
System.out.println(p);
几个例子:
答案 4 :(得分:0)
听起来像是模板方法设计模式的应用......