Have a
List<Map<String, Object>> allPoints = new LinkedList<>();
每个地图都包含一个名为
"name"
的键,其值为字符串;
需要创建一个。 List<Map<String, Object>> expectedPoints
列表中存在重复的名称;对于这些名称,只需保留最后一个。
例如,如果列表有三个项目,并且第一项和第三项都具有值为“abc”的“name”,则生成的列表应仅包含原始列表中的第二个和第三个项目。
Have a
List<Map<String, Object>> allPoints = new LinkedList<>();
"name"
的键,其值为字符串;
需要创建一个。 List<Map<String, Object>> expectedPoints
列表中存在重复的名称;对于这些名称,只需保留最后一个。
例如,如果列表有三个项目,并且第一项和第三项都具有值为“abc”的“name”,则生成的列表应仅包含原始列表中的第二个和第三个项目。
其中一种方法是使用辅助地图:
Map<String, Map<String, Object>> map = new LinkedHashMap<>(allPoints.size(), 0.75f, true);
allPoints.forEach(point -> map.put((String)point.get("name"), point));
List<Map<String, Object>> expectedPoints = new ArrayList<>(map.values());
Map.put
方法会将新条目添加到映射表中,或覆盖现有条目的值,从而仅保留与名称关联的最后一个点。LinkedHashMap
,以保持与allPoints
列表中相同的顺序。LinkedHashMap
的输入参数是桶的数量,而不是元素数量 (CHM
用于元素),因此最好将其写作 allPoints.size() / 0.75 + 1
。 - Eugene如果您对一个或多个键值对有限制,并且可以灵活使用Set,请编写自己的比较器并在LinkedList上使用descendingIterator,然后写入TreeSet。请参见以下代码:
LinkedList<Map<String, Object>> allPoints = new LinkedList<>();
Set<Map<String, Object>> expectedPoints = new TreeSet<>((objectMap1, objectMap2) ->
objectMap2.get("name").equals(objectMap1.get("name")) ? 0 : -1
);
allPoints.descendingIterator().forEachRemaining(expectedPoints::add);