3 回答
TA贡献1802条经验 获得超6个赞
要获取每个组的最后一次出现,您可以使用带有 groupingBy 的流 api:
import static java.util.stream.Collectors.*;
Map<String, Optional<String>> collect = newData.stream()
.collect(groupingBy(strings -> strings.split("-")[0],
mapping(s -> s, maxBy(Comparator.comparingInt(newData::lastIndexOf)))));
注意:地图有Optional一个值
要获得它而不Optional使用toMap而不是groupingBy:
Map<String, String> collect = newData.stream()
.collect(toMap(s -> s.split("-")[0],
Function.identity(),
(s1, s2) -> newData.lastIndexOf(s1) > newData.lastIndexOf(s2) ? s1 : s2));
此外,如果您想拥有没有组名的地图值,请更改Function.identity()为s -> s.split("-")[1]
TA贡献1998条经验 获得超6个赞
正如其他答案已经表明的那样,有几种方法可以做到这一点。我会发现类似以下自然的东西:
Collection<String> lastOfEach = newData.stream()
.collect(Collectors.groupingBy((String s) -> s.split("-")[0],
Collectors.reducing("", s -> s, (l, r) -> r)))
.values();
lastOfEach.forEach(System.out::println);
使用您的列表,输出为:
A-fdsfdsfgs
B-dsdfsad
我的分组与其他几个答案相同。在分组值上,我执行缩减,每次我得到两个字符串时都取后者。最后,这将根据要求为我们提供每个组的最后一个字符串。由于groupingBy生成了地图,我使用values丢弃键 (A和B) 并仅获取原始字符串。
TA贡献1794条经验 获得超8个赞
import java.util.*;
class Solution {
public static void main(String[] args) {
List<String> newData = new ArrayList<>();
newData.add("A-something");
newData.add("A-fdfdsfds");
newData.add("A-fdsfdsfgs");
newData.add("B-something");
newData.add("B-dsafdrsafd");
newData.add("B-dsdfsad");
System.out.println(lastOccurrences(newData).toString());
}
private static List<String> lastOccurrences(List<String> data){
Set<String> set = new HashSet<>();
List<String> ans = new ArrayList<>();
for(int i=data.size()-1;i>=0;--i){
String group = data.get(i).substring(0,data.get(i).indexOf("-"));
if(set.contains(group)) continue;
set.add(group);
ans.add(data.get(i));
}
return ans;
}
}
输出:
[B-dsdfsad, A-fdsfdsfgs]
算法:
从最后一个移到第一个,而不是从第一个到最后,因为你想要
last occurrences。这将使管理更容易,代码更简洁。使用substring()方法获取字符串所属的组。
使用一组来跟踪已经访问过的组。
如果一个组不在集合中,则将其添加到集合中,并将当前字符串添加到该组的答案中(因为这将是最后一次出现)。
最后,返回列表。
添加回答
举报
