查找列表

时间:2016-01-12 05:56:33

标签: java arraylist

我有一种情况,我有一个列表(必需的项目),其中包含表格列结果,如:

NAME
ADDRESS
AGE
.
.
etc

在我的方法中,我得到一个包含user.getName(), user.getAge() etc.值的User对象。我想知道确保列表中的每个项都出现在用户对象中的最佳方法。列表中的项目数是可变的。

public boolean isUserInfoComplete(User user, ArrayList list){
   //so, if the list has AGE, the user.getAge() must have some value 
}

我想到的一种方法是维护另一个列表,该列表包含每个用户信息的值,并根据我的数据库列表进行检查但是不可扩展。

4 个答案:

答案 0 :(得分:2)

无法动态匹配您的方法名称与没有反射的列表内容(这可能是昂贵且脆弱的)。您可能需要考虑将User值保留在中央Map缓存中。这是一种方法:

public class User {

    private enum Field {
        NAME,
        AGE
        //...
    }

    private Map<String, Object> values = new HashMap<>();

    private void putValue(Field field, Object value) {
        values.put(field.name(), value);
    }

    private Object getValue(Field field) {
        return values.get(field.name());
    }

    public void setName(String name) {
        putValue(Field.NAME, name);
    }

    public String getName() {
        return (String)getValue(Field.NAME);
    }

    public void setAge(int age) {
        putValue(Field.AGE, age);
    }

    public Integer getAge() {
        return (Integer)getValue(Field.AGE);
    }

    //...

    public boolean isUserInfoComplete(List<String> fields) {
        return values.keySet().containsAll(fields);
    }
}

答案 1 :(得分:1)

如果列表中的项目与User对象中的getter匹配,则可以使用反射来解决此问题。

例如,如果AGE在列表中,您可以使用反射在User类上查找getAge()方法,在对象上调用它,然后检查结果为null(或切换在方法返回类型上执行其他类型的检查)。

这是您尝试的起点(我还没有编译或测试过它):

public boolean isUserInfoComplete(User user, ArrayList list){
    for(String attribute : list) {
        String methodName = "get" + attribute.substring(0, 1).toUpperCase() + attribute.substring(1).toLowerCase();
        Method method = User.class.getMethod(methodName, null);
        if(method != null) {
            Object result = method.invoke(user);
            if(result == null) {
                return false;
            }
        }
    }
    return true;
}

答案 2 :(得分:1)

这似乎是需要反思的情况。这使您有机会在运行时检查对象中的方法和字段。

如果您知道您的用户对象等将遵循java bean标准,那么您将能够使用getter进行检查,但我现在看到在创建字段public final时出现问题并直接检查字段本身。

查看https://docs.oracle.com/javase/tutorial/reflect/

答案 3 :(得分:0)

您可以在循环时使用contains()进行检查。这个过程非常耗费资源。 也许你可以重新设计一些东西并简单地比较两个User对象?会更快。您可以通过提供自己的equalshashcode方法实现来实现。