从HashMap中获取值<string,arraylist <string =“”>&gt; </string,>

时间:2014-10-25 21:57:07

标签: java hashmap

[更新代码] (对不起家伙,我没有提供完整的代码,因为根据我的经验,大型代码似乎“吓跑”可能的帮助者。)

对于ExpandableListView,我想构建一个HashMap<String, ArrayList<String>>,其中String是类别的名称,ArrayList<String>属于该类别的动物的名称。我这样填充HashMap:

HashMap<String, ArrayList<String>> map_groups_childs;
ArrayList<String> list_group_titles;

private void prepareListData(ArrayList<Id_triv_cat> search_results) {
    list_group_titles = new ArrayList<String>();                  // this is a list of group titles
    map_groups_childs = new HashMap<String, ArrayList<String>>(); // this is a map. each group title gets a list of its respective childs

    // temporary List of items for a certain category/group
    ArrayList<String> temp_childs_list = new ArrayList<String>();

    // "search_results" is an ArrayList of self defined objects each containing an ID, a name and a category name
    int count = search_results.size();
    int i_cat = 0;
    int i=0;

    // if category "i" is the same as the next category "i+1", add child to list
    for (i=0; i<count-1; i++) {
        // build group with category name
        list_group_titles.add(search_results.get(i).get_type());

        // while category does not change, add child to the temporary childs-array
        while (i<=count && search_results.get(i).get_type().equals(search_results.get(i+1).get_type())) {
            temp_childs_list.add(search_results.get(i).get_name());
            i++;
        }

        // must be done, as the while loop does not get to the last "i" of every category
        temp_childs_list.add(search_results.get(i).get_name());

        Log.i("DEBUG", temp_childs_list.size());      // --> returns always more than 0
        Log.i("DEBUG", temp_childs_list.toString());  // --> returns always something like [word1, word2, word3, ...]
        Log.i("DEBUG", list_group_titles.get(i_cat)); // --> returns always a single word like "Insekten"

        // add [group_title:list_of_childs] to map
        map_groups_childs.put(list_group_titles.get(i_cat++), temp_childs_list);

        // clear temp_list, otherwise former category's species will be added to new category
        temp_childs_list.clear();
    }
Log.i("DEBUG", map_groups_childs.containsKey("Insekten"));  // --> returns true
Log.i("DEBUG", map_groups_childs.size());                   // --> returns 10
Log.i("DEBUG", map_groups_childs.get("Insekten").size());   // --> returns 0
Log.i("DEBUG", map_groups_childs.toString());               // --> returns {Insekten=[], Reptilien=[], ...}
}

在for循环和while循环中使用相同的i可能看似错误或令人困惑,但它没关系。不会以任何方式跳过i或使用两次。

我放在HashMap中的所有键都在那里,但我想要的(例如)map_groups_childs.get("Insekten")的ArrayList是空的。我做错了什么?

3 个答案:

答案 0 :(得分:2)

我可以告诉您需要的是下面第二组中的5行

    HashMap<String, ArrayList<String>> map_groups_childs = new HashMap<String, ArrayList<String>>();
    ArrayList<String> list_group_titles = new ArrayList<String>();
    ArrayList<String> temp_childs_list  = new ArrayList<String>();

    list_group_titles.add("insects");
    temp_childs_list.add("Swallowtail");
    temp_childs_list.add("Small White");
    temp_childs_list.add("Large White");
    temp_childs_list.add("Silverfish");

    int k = 0; 

    Log.i("DEBUG", list_group_titles.get(k)); // --> returns "insects"
    Log.i("DEBUG", temp_childs_list);         // --> returns [Swallowtail, Small White, Large White, Silverfish]

    map_groups_childs.put(list_group_titles.get(k), temp_childs_list);

    Log.i("DEBUG", map_groups_childs.size());                 // --> returns 1 not 10
    Log.i("DEBUG", map_groups_childs.containsKey("insects")); // --> returns true
    Log.i("DEBUG", map_groups_childs.get("insects").size());  // --> returns 4 not 0

答案 1 :(得分:2)

即使进行了编辑,您的代码仍然缺少有关正在发生的事情的巨大线索。我做了一些猜测,如果我是对的,你就是这么做的。

我推断出存在一个名为Id_triv_catget_name()的getter的类get_type()

static class Id_triv_cat {

    String type;
    String name;

    Id_triv_cat( String type, String name )
    {
        this.name = name;
        this.type = type;
    }

    public String get_type()
    {
        return type;
    }
    public String get_name()
    {
        return name;
    }
}

我还编写了此代码来测试您的prepareListData()方法。

public static void main(String[] args){
    ArrayList<Id_triv_cat> search_results = new ArrayList<Id_triv_cat>();
    search_results.add( new Id_triv_cat("type1", "name1") );
    search_results.add( new Id_triv_cat("type2", "name2") );
    search_results.add( new Id_triv_cat("Insekten", "insekten name1") );
    search_results.add( new Id_triv_cat("Insekten", "insekten name2") );
    search_results.add( new Id_triv_cat("type3", "name3") );
    new Test().myPrepareListData( search_results );
}

虽然我可以修复你的小缺陷,就像一个好的SE居民一样,但是我冒着将所有这些迁移到程序员的风险,因为你最大的问题是设计问题。您的代码缺乏明确的本地标识符。你没有制作本地人,而是使用了java实用程序类,这使得你的代码变得毫无意义。

如果我怀疑您尝试使用list Id_triv_cat private void myPrepareListData(ArrayList<Id_triv_cat> search_results) { // Each group title is mapped to a list of its respective children HashMap<String, ArrayList<String>> my_map_groups_childs = new HashMap<String, ArrayList<String>>(); for (Id_triv_cat search_result : search_results) { String type = search_result.get_type(); String name = search_result.get_name(); if ( my_map_groups_childs.containsKey(type) ) { ArrayList<String> names = my_map_groups_childs.get(type); names.add(name); } else { ArrayList<String> names = new ArrayList<String>(); names.add(name); my_map_groups_childs.put(type, names); } } Log.i("DEBUG", "my_map_groups_childs = " + my_map_groups_childs); } 使用其类型作为键并将名称作为值来构建地图,请尝试以下操作:< / p>

my_map_groups_childs = {Insekten=[insekten name1, insekten name2], type1=[name1], type3=[name3], type2=[name2]}

显示:{{1}}

了解一些精心挑选的本地人如何让生活变得如此轻松?

如果那不是你想要的,你就必须让你的问题更清楚。

Radiodef是对的。在用Java编写代码时,你真的应该使用camelCase。

答案 2 :(得分:2)

    ...

    map_groups_childs.put(..., temp_childs_list);

    temp_childs_list.clear();
}

对象在Java中作为引用传递。您始终将相同的List放入Map中,并在每次迭代后清除它。因此,Map中的每个值都指向同一个列为空的List。

你可能需要的是这样的东西:

for( ... ) {
    List<String> tempChildsList = new ArrayList<>();

    ...

    mapGroupChilds.put(..., tempChildsList);
}

因此,每次迭代都会创建一个新的List。

我也同意@CandiedOrange您的代码是一团糟,可能过于复杂。一般来说,像List和Map这样的抽象点不是通过一直计算数字索引来访问事物。

请注意,在Java中,惯例是变量的标识符是camelCase,而不是under_scored。