将Set和List合并到HashMap

时间:2014-04-11 13:15:23

标签: java list arraylist hashmap set

我有一个集合,其键是字符串和List类型字符串我想从这个集合和列表中创建一个HashMap。该集包含类别,列表包含属于这些类别的地点。以下就是我试过的

Set<Entry<String, Integer>> setUserPreferences = sortedUserPreferences.entrySet();
Map<String , Integer> sortedPlaces = new HashMap<String, Integer>();
List<String> topPlaces = new ArrayList<String>();
Map<String , List<String>> finalPlaces = new HashMap<String, List<String>>();
for (Entry<String, Integer> entry : setUserPreferences) {
        sortedPlaces = placesService.sortPlaces(categorisedPlaces.get(entry.getKey()));
        int counter = 0;
        for (Map.Entry<String, Integer> sortedplace : sortedPlaces.entrySet()) {
            topPlaces.add(sortedplace.getKey());
            counter++;
            if(counter == 5){
                sortedPlaces.clear();
                break;
            }       
        }
        finalPlaces.put(entry.getKey(), topPlaces);
        topPlaces.clear();
    }

首先我遍历集合,对于每个键,我得到已排序的位置,在排序的位置,我为每个类别选择前5个位置,最后我把它放在地图中,其中键是类别,值是该类别中排名前5位的名单。

我需要为集合上的每次迭代清除topPlaces列表,因为我不想让一个类别中的位置出现在另一个类别中,但是一旦我将列表放在map(finalPlaces)中并清除列表它也清除地图值。

如何在不清除地图值的情况下清除列表。

由于

1 个答案:

答案 0 :(得分:2)

topPlaces是对Object的引用,而不是基元。因此,如果将其存储在地图中,则会有两个对同一个对象的引用,一个在Map内部,一个在外部。如果你擦一个,你擦拭它们。

如果要在不删除存储列表的情况下清除topPlaces,则需要先将其复制,然后再将其添加到地图中。

这样的事情:

finalPlaces.put(entry.getKey(), new ArrayList<String(topPlaces));