2013-10-10 2 views
2

Это мой первый вопрос в 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

Что вы сделали до сих пор?. Покажите нам код, который вы написали, чтобы достичь этого, чтобы мы могли помочь –

+0

Я попытался создать список! затем создайте еще один список и добавьте его в другой список в виде списка объектов и поместите его на карту, но все же вывод не подходит по желанию –

ответ

1

Попробуйте это,

добавить все объекты в flist.

инициализации карты

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

собирается добавить объект к соответствующему key на основе значения Func объект будет добавить в список значений.

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()); 
    } 
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, и что эти члены должны быть частными.

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); 
    } 
} 

Примечание

Как уже упоминалось Крис, вы должны думать о вашем дизайне кода. Используйте getters и setters ..

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 + "]"; 
    } 


} 
+0

Hi Nagendra !! Спасибо за быстрый ответ!! я видел этот код, но что происходит, так это то, что когда вы будете жестко кодировать эти значения, это будет очень сложно поддерживать! я хотел что-то, что может иметь значения из UI или DB, которые могут быть динамическими и могут меняться и расти –

+0

Я дал вам псевдокод. Это зависит от вашей реализации, чтобы решить, откуда должны исходить ценности. –

+0

да, я получил его сейчас спасибо! Nagendra !! –

0

Написать свою собственную карту. Передайте список, чтобы карта, пусть карта решит, какую часть списка сохранить в качестве значения. Я добавил метод ввода здесь, как то же самое, должен 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.. 

} 
Смежные вопросы