2013-06-27 89 views
3

我有这样一个对象:打印数据

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中转换的对象:

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(“姓名:$ 1%的”,字符串),因为模板的变化很大,但传入的对象类型是独一无二的。 。

UPD:谢谢你的答案,但这个想法是会有用的模板列表,它会被插入到数据的文件,例如:

String template1 = "Your selected Name is $name%s and selected age $age%i"; 
String template2 = "User: $name%s; Age: $age%i"; 

因此,对象本身将包含更多的获得者。

+0

覆盖'的toString()'。 –

+0

我相信你可以从你的类中重载的'toString()'方法返回一个格式化的字符串! – NINCOMPOOP

回答

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

+0

这与我所需要的非常相似,但我仍然会首选getter的选项。 – arkhamvm

0

只是override亲自对象toString()方法对您个人object.

@Override 
    public String toString() { 
     return "Name:"+this.name+"age:"+this.age; 

    } 

然后用像System.out.printLn(person.toString());

0

覆盖toString()函数从对象状态打印。

实施例:

@Override 
    public String toString() { 
     return "Name: "+this.getName()+" Age: "+this.getAge()"; 

    } 

和使用它:

Person p = new Person(); 
... 
System.out.println(p); 

几个例子:

Ref1

Ref2

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)); 

,此方法只一个骨架,如果你想使用它的更严重的事情,你将不得不改善这种方法来做到以下几点:

  • 验证字段名称只有AZ,az,0-9,(或修改正则表达式)
  • 验证情况下,在模板领域在地图上不
  • 一些其他的东西指定了我的思念,现在
+0

问题是我不知道模板中参数的数量和顺序。 – arkhamvm

+1

@ Arkham.vm你知道这些模板的格式吗?你打算设计这样的模板还是已经完成了? – morgano

+0

我将自己设计它,以便如果现有解决方案具有不同的设计模板,则可以接受。 – arkhamvm

0

听起来就像模板方法设计模式的应用...