这是我在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]
如果我有列表,但如何去找到所需的上述输出
答案 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约定声明您应该在getters
和setters
中包装您的成员对象,并且这些成员应该是私有的。
答案 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已经提到的,你应该考虑你的代码设计。使用getters
和setters
..
答案 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..
}