使用List将结果集数据推送到嵌套的hashmap

时间:2017-11-07 09:07:08

标签: java jdbc hashmap

我正在尝试将结果集数据推送到嵌套地图上。老实说,我一直在努力解决如何做到这一点的逻辑。以下是我的结果集数据的示例

ID Main    Sub
1  Root    Carrots
2  Root    Beets
3  Root    Turnips
4  Leafy   Spinach
5  Leafy   Celery
6  Fruits  Apples
7  Fruits  Oranges

我创建了一个hashmap HashMap<Integer, HashMap<String, List<String>>>,其中我认为innermap可以将主col作为键,将相应的subs作为值列表。 outermap将包含id作为键,相应的map作为值。我正在努力实现这一目标。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:0)

以下是您的问题的答案。但问题可能是错误的。由于ID是唯一的(只是猜测),您可能正在寻找

Map<Integer, DataObject> map = new HashMap<>();

其中DataObject是包含变量mainsub的POJO。将数据添加到这样的结构很容易。

回答问题(添加以向您展示地图和列表的工作原理):

private Map<Integer, Map<String, List<String>>> map = new HashMap<>();

public static void main(String[] args) {
    new Tester().go();
}

private void go() {
    add(1, "Root", "Carrots");
    add(2, "Root", "Beets");
    add(3, "Root", "Turnips");
    add(4, "Leafy", "Spinach");
    add(5, "Leafy", "Celery");
    add(6, "Fruits", "Apples");
    add(7, "Fruits", "Oranges");
}

private void add(int id, String main, String sub) {
    if (!map.containsKey(id)) {
        map.put(id, new HashMap<String, List<String>>());
    }
    ArrayList<String> list = new ArrayList<String>();
    list.add(sub);
    map.get(id).put(main, list);
}

答案 1 :(得分:0)

我建议使用不同的结构。 您有唯一的ID和子,但您的Main可能是重复的。 因此我建议使用以下结构: 的HashMap&GT; 其中POJO有ID和sub。 地图的关键是主要的。 因此,您可以轻松地做到:

if (map.get(main)==null){
List<POJO> pojoList= new List<>();
    pojolist.add(pojo);
}else{
    List<POJO> pojoList=map.get(main);
    pojoList.add(pojo);
}

但最终取决于你是否需要使用ID或main进行查找。

答案 2 :(得分:0)

不需要创建嵌套哈希映射,因为示例中的每一行都是唯一的(嵌套映射中的每个List只有一个值)。

在任何情况下,这里都是Java 8风格的算法示例,以满足您的特殊需求:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class Main {

    public static void main(String[] args) {
        List<ResultSet> rows = new ArrayList<>();
        rows.add(new ResultSet().setId(1).setMain("Root").setSub("Carrots"));
        rows.add(new ResultSet().setId(2).setMain("Root").setSub("Beets"));
        rows.add(new ResultSet().setId(3).setMain("Root").setSub("Turnips"));
        rows.add(new ResultSet().setId(4).setMain("Leafy").setSub("Spinach"));
        rows.add(new ResultSet().setId(5).setMain("Leafy").setSub("Celery"));
        rows.add(new ResultSet().setId(6).setMain("Fruits").setSub("Apples"));
        rows.add(new ResultSet().setId(7).setMain("Fruits").setSub("Oranges"));

        HashMap<Integer, HashMap<String, List<String>>>  result = new HashMap<>();
        rows.forEach(row -> {
            HashMap<String, List<String>> subsByMain = result.getOrDefault(row.getId(), new HashMap<>());
            List<String> subs = subsByMain.getOrDefault(row.getMain(), new ArrayList<>());
            subs.add(row.getSub());
            subsByMain.put(row.getMain(), subs);
            result.put(row.getId(), subsByMain);
        });
    }


    static class ResultSet {
        private Integer id;
        private String main;
        private String sub;

        Integer getId() {
            return id;
        }

        ResultSet setId(Integer id) {
            this.id = id;
            return this;
        }

        String getMain() {
            return main;
        }

        ResultSet setMain(String main) {
            this.main = main;
            return this;
        }

        String getSub() {
            return sub;
        }

        ResultSet setSub(String sub) {
            this.sub = sub;
            return this;
        }
    }
}