从地图中的列表中查找对象

时间:2013-10-10 08:05:19

标签: java

这是我在Stackoverflow中的第一个问题。我已经找到了建议的问题之一的问题,并由我的同事给我做一些研究。

我的问题是 我有一个班级

   Class Function{
    String func;
   String funcname;
   boolean log;
   }

我创建了一些对象:

 obj1 : ("a" ,"b",true)- //these values come from either DB or UI
obj2 : ("c" ,"x",true)
obj3 : ("a" ,"z",true)

我有一个清单:

      List<function> flist;

现在我想在地图中列出该列表,并希望将其放入地图内

     Map<String, List<function>> funcMap

然后显示以下输出:

    a:[obj1 obj3]
    b:[obj2]

如果我有列表,但如何去找到所需的上述输出

5 个答案:

答案 0 :(得分:1)

嗯..我认为这是以嵌套循环方式解析列表的情况。这是伪代码:

public void listToMap(List<Function> list)
{
    Map<String, List<Function>> map := new Map
    for every function in the list.
    {
        if(is the current function's func value does not exist in the map)
        {
             func := current functions func value
             List matchingFunctions := new list of Functions.
             for(every function in the list.)
             {
                 // Every Function with the same key get's added to a list.
                 if(function has the same func value as func)
                 {
                     add to matchingFunctions.
                 }
             }

             // That list and key get put into the HashMap.
             map.put(func, matchingFunctions).
        }
    }
}

关于代码设计的注意事项

Java约定声明您应该在getterssetters中包装您的成员对象,并且这些成员应该是私有的。

答案 1 :(得分:1)

试试这个,

添加flist

中的所有对象

初始化地图

  Map<String, List<Function>> funcMap = new HashMap<String, List<Function>>();

根据对象将添加到值列表的func值将对象添加到相关的key

  for (Function functionValue : flist)
    {
        List<Function> functionList = funcMap.get(functionValue.getFunc());
        if (functionList != null && !functionList.isEmpty())
        {
            functionList.add(functionValue);
        }
        else
        {
            functionList = new ArrayList<Function>();
            functionList.add(functionValue);
            funcMap.put(functionValue.getFunc(), functionList);
        }
    }

Atlast打印funcMap

    for (Map.Entry< String, List<Function>> entry : funcMap.entrySet())
    {
        System.out.println("Key :  " + entry.getKey() + "Values : "+entry.getValue());
    }

答案 2 :(得分:0)

怎么样:

public class FuncTest {

    public static void main(String[] args) {
        new FuncTest().start();

    }

    private void start() {
        List<Function> flist = new ArrayList<Function>();
        flist.add(new Function("a", "b", true));
        flist.add(new Function("c", "x", true));
        flist.add(new Function("a", "z", true));

        Map<String, List<Function>> funcMap = new HashMap<String, List<Function>>();
        for (Function func : flist) {
            this.add(func.func, func, funcMap);
            this.add(func.funcname, func, funcMap);
        }
    }

    private void add(String field, Function func, Map<String, List<Function>> funcMap) {
        List<Function> subList = funcMap.get(field);
        if (subList == null) {
            subList = new ArrayList<Function>();
            funcMap.put(field, subList);
        }

        subList.add(func);
    }
}

注意

正如Chris已经提到的,你应该考虑你的代码设计。使用getterssetters ..

答案 3 :(得分:0)

public class Stackoverflow {

    public static void main(String[] args) {
        Function obj1 = new Function("a" ,"b",true);
        Function obj2 = new Function("c" ,"x",true);
        Function obj3 = new Function("a" ,"z",true);

        List<Function> functionsList1 = new ArrayList<Function>();
        functionsList1.add(obj1);
        functionsList1.add(obj3);

        List<Function> functionsList2 = new ArrayList<Function>();
        functionsList2.add(obj2);

        Map<String, List<Function>> funcMap = new LinkedHashMap<String, List<Function>>();
        funcMap.put("a", functionsList1);
        funcMap.put("b", functionsList2);

        Set<Entry<String,List<Function>>> entrySet = funcMap.entrySet();
        for (Entry<String, List<Function>> entry : entrySet) {
            System.out.println(entry.getKey() + " : " + entry.getValue());
        }
    }

}

class Function {
    String func;
    String funcname;
    boolean log;

    public Function(String func, String funcname, boolean log) {
        super();
        this.func = func;
        this.funcname = funcname;
        this.log = log;
    }

    @Override
    public String toString() {
        return "Function [func=" + func + ", funcname=" + funcname + ", log="
                + log + "]";
    }


}

答案 4 :(得分:0)

编写自己的地图。 将列表传递给map,让map确定要保留的列表的哪个部分作为值。 我在这里添加了put方法,就像使用Override其他方法一样。

class MyHashMap<K,V> extends HashMap<K,V>{
    @SuppressWarnings("unchecked")
    public V put(K k, V v) {
        String key  = (String)k; 
        List<Function> list = (List<Function>) v;
        List<Function> list2 = new ArrayList<Function>();
        for (Function function : list) {
            if(key.equalsIgnoreCase(function.func)){
                list2.add(function);
            }
        }
        return (V) list2;
    };

    @Override
    public boolean equals(Object o) {
        // Your own code
       return true;
    }
    // other methods goes here..

}