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

因此,对象本身将包含更多的吸气剂。

4

5 回答 5

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(或修改正则表达式)
  • 验证模板具有未在地图中指定的字段的情况
  • 我现在缺少的其他一些东西
于 2013-06-27T09:57:59.407 回答
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

于 2013-06-27T11:24:51.673 回答
0

只是你的人override的方法toString()object.

个人对象

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

    }

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

于 2013-06-27T09:55:27.107 回答
0

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

例子:

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

    }

并使用它:

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

几个例子:

参考1

参考2

于 2013-06-27T09:56:02.487 回答
0

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

于 2013-06-27T10:37:11.430 回答