通过getter / keys从Object / Hashmap打印数据

时间:2013-06-27 09:54:12

标签: java hashmap printf

我有一个这样的对象:

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

因此,物体本身将包含更多的吸气剂。

5 个答案:

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

这个方法只是一个骨架,如果你想将它用于更严重的事情,你必须改进这个方法来执行以下操作:

  • 验证字段名称只有A-Z,a-z,0-9,(或修改正则表达式)
  • 验证模板中未在地图中指定字段的情况
  • 我现在缺少的其他一些事情

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

几个例子:

Ref1

Ref2

答案 4 :(得分:0)

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