批量更换char

时间:2014-08-26 12:11:51

标签: java string

我有一个超过90个属性的域对象。在所有这些属性中都有.,我想用空字符串替换它。

我现在可以做:

for (int i = 0; i < list.size(); i++) {
    list.get(i).getProp1().replace(".", "");
    list.get(i).getProp2().replace(".", "");
    //yadadada ...
    list.get(i).getProp90().replace(".", "");
}

然而,这非常无聊并需要编写大量代码。有没有办法更优雅,更快地做到这一点?

感谢您的想法

5 个答案:

答案 0 :(得分:2)

如何在您的Domain类中创建方法updateProp(因为这就是您所需要的):

public void updateProp(int index) {
    prop[index] = prop[index].replace(".", "");
}

然后在循环中调用它

for (int i = 0; i < list.size(); i++) {
    for(int j=0; j < prop.length; j++) { /*use a getter, instance or class 
                                     reference for obtaining prop.length*/
        list.get(i).updateProp(j);
    }
}

将Prop保存在自己的Object中也可以解决问题,但我想它会破坏更多的代码而不是修复它。

答案 1 :(得分:1)

你必须使用java反射:

    Method[] methods = DomainObject.class.getDeclaredMethods();
    for (Method method : methods) {
        if (method.getName().startsWith("getProp")) {
            String result = (String) method.invoke(object, new Object[0]);
            result = result.replace(".", "");
            Method setter = DomainObject.class.getMethod(method.getName()
                    .replace("get", "set"), String.class);
            setter.invoke(object, result);
        }
    }

另外不要忘记String是不可变的,replace方法不会改变它,调用只返回更改后的版本。

答案 2 :(得分:1)

如果您无法修改对象(可能是自动生成的或其他内容),您可以通过反思来实现目标:

for(MyObject a: list){
    Field[] fields = MyObject.class.getDeclaredFields();
    for (Field f : fields) {
        try {
            if (f.get(a) instanceof String) {
                String str = ((String) f.get(a)).replace(".", "");
                f.set(a, str);
            }
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

如果您不想修改对象的值,可以创建The Monster:

List<Map<String, String>> monster = new ArrayList<Map<String, String>>();
for(MyObject a: list){
    Field[] fields = MyObject.class.getDeclaredFields();
    Map<String, String> map = new HashMap<String, String>();
    for (Field f : fields) {
        try {
            if (f.get(a) instanceof String) {
                String str = ((String) f.get(a)).replace(".", "");
                map.put(f.getName(), str);
            }
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
    monster.add(map);
}

现在,您可以通过反射创建一个美丽的地图列表。您可以通过

访问第一个对象的prop1
String obj1prop1 = monster.get(0).get("prop1"); //Value of prop1 for first object in list.

答案 3 :(得分:1)

您建议您拥有一个Java类,该类具有多达90个属性,且数据字段的格式始终不正确。这个问题可能是X-Y Problem

使用.存储属性的原因,以及没有.

的原因

通过更好地了解这些原因及其背景,可以呈现更清洁的解决方案。

例如,是否仅仅为了显示目的而移除.?也许在输出点考虑一个通用函数来去除.

或许这可能是数据捕获过程中的某种行为副作用,在这种情况下,这需要成为输入过滤器的一部分。

或者这是一次性的ETL例行程序吗?在这种情况下,也许可以通过一些通用SQL或grep / sed脚本直接在数据列上完成。

答案 4 :(得分:0)

我想对我来说最好的方法是在你的Object中创建一个方法(列表中的方法),在这个方法中,你可以像在这里一样直接更改所有属性。比你打电话给你的方法,而不是所有这些。 治疗将直接在您的对象上;)

for (int i = 0; i < list.size(); i++) {
    list.set(i,list.get(i).update());
}

在你的对象中:

public void update()
{
    prop1 = prop1.replace(".","");
    etc for all the properties
}

如果您的属性是公开的,也可以使用Field[] getFields()之类的内容。

但实际上,我认为你应该在创建对象时进行替换,因此在将其添加到列表中之前。会更好。