无法根据某些条件对某些值进行分组

时间:2012-10-18 04:12:44

标签: java

我有一些值从数据库返回作为结果集,如下所示

**resource_name         menu_name       menu_group_name**
DepartmentAction        Department      Admin Operation
PositionAction          Position        Admin Operation
FoodHabitAction         FoodHabits      Admin Operation
ReligiousAction         Religious       Admin Operation
NationalitiesAction     Nationlities    Admin Operation

我想基于menu_group_name对resource_name和menu_name进行分组,如下面的

如果menu_group_name与所有相应的组相同     resource_name和menu_mane反对menu_group_name。

这是我试过的方法,

public Map<String,List> getMenuForLoggedinRole(int roleid){
        Map<String,List> menuListMap = new LinkedHashMap<String,List>();
        List<MenuListViewModel> menuNamesList = new ArrayList<MenuListViewModel>();
        MenuListViewModel menuViewModel;
        Connection connection = getConnection();
        PreparedStatement ps = null;
        ResultSet rs = null;
        if (connection != null) {
            try {
                ps = connection.prepareStatement(" select ar.resource_name,ar.menu_name,mg.menu_group_name "
                        + " from m_application_resources as ar,"
                        + " m_menu_groups as mg,m_access_matrix as amatrix "
                        + " where ar.resourceid = amatrix.resourceid and amatrix.roleid=?");
                ps.setInt(1, roleid);
                rs = ps.executeQuery();
                if(rs.next()) {
                   String menu_group_name = rs.getString("menu_group_name");
                   String resource_name = rs.getString("resource_name");
                   String menu_name = rs.getString("menu_name");
                   if(menuListMap.containsKey(menu_group_name)){
                       menuNamesList =(List) menuListMap.get(menu_group_name);
                       menuViewModel = new MenuListViewModel();
                       menuViewModel.setResource_name(resource_name);
                       menuViewModel.setMenu_name(menu_name);
                       menuNamesList.add(menuViewModel);
                       menuListMap.put(menu_group_name, menuNamesList);
                   }else{
                       menuViewModel = new MenuListViewModel();
                       menuViewModel.setResource_name(resource_name);
                       menuViewModel.setMenu_name(menu_name);
                       menuNamesList.add(menuViewModel);
                       menuListMap.put(menu_group_name, menuNamesList);
                   }
                } 
            } catch (Exception ex) {
                ex.printStackTrace();
            }finally {
                try {
                    closeConnection(connection, rs, ps);
                } catch (Exception ex) {
                    ex.printStackTrace();
                    //use logger here
                }
            }
        }

        printMap(menuListMap);
        return menuListMap;
    }

但它没有给我令人厌恶的输出。

我的观点模型:

public class MenuListViewModel {

    private String resource_name = "";
    private String menu_name = "";

    public String getResource_name() {
        return resource_name;
    }

    public void setResource_name(String resource_name) {
        this.resource_name = resource_name;
    }

    public String getMenu_name() {
        return menu_name;
    }

    public void setMenu_name(String menu_name) {
        this.menu_name = menu_name;
    }

}

 public static void printMap(Map mp) {
        List menuList = new ArrayList();
        MenuListViewModel model;
        Iterator it = mp.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry pairs = (Map.Entry)it.next();
            menuList =(List) pairs.getValue();
            for(int i=0;i<=menuList.size();i++){
                model =(MenuListViewModel) menuList.get(i);
                System.out.println("Resource_name :  "+model.getResource_name());
                System.out.println("Menu_name :  "+model.getMenu_name());
            }
            System.out.println(pairs.getKey() + " = " + pairs.getValue());
            it.remove(); // avoids a ConcurrentModificationException
        }
}

请帮忙。

1 个答案:

答案 0 :(得分:1)

如果key不包含在map中,那么您将实例化新的List。否则它将使用先前的列表对象(如果存在)。

                   if(menuListMap.containsKey(menu_group_name)){
                       menuNamesList =(List) menuListMap.get(menu_group_name);
                       menuViewModel = new MenuListViewModel();
                       menuViewModel.setResource_name(resource_name);
                       menuViewModel.setMenu_name(menu_name);
                       menuNamesList.add(menuViewModel);
                       menuListMap.put(menu_group_name, menuNamesList);
                   }else{
                       menuNamesList = new ArrayList<MenuListViewModel>();
                       menuViewModel = new MenuListViewModel();
                       menuViewModel.setResource_name(resource_name);
                       menuViewModel.setMenu_name(menu_name);
                       menuNamesList.add(menuViewModel);
                       menuListMap.put(menu_group_name, menuNamesList);
                   }