3 回答

TA貢獻1802條經(jīng)驗 獲得超6個贊
要獲取每個組的最后一次出現(xiàn),您可以使用帶有 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條經(jīng)驗 獲得超6個贊
正如其他答案已經(jīng)表明的那樣,有幾種方法可以做到這一點。我會發(fā)現(xiàn)類似以下自然的東西:
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
我的分組與其他幾個答案相同。在分組值上,我執(zhí)行縮減,每次我得到兩個字符串時都取后者。最后,這將根據(jù)要求為我們提供每個組的最后一個字符串。由于groupingBy生成了地圖,我使用values丟棄鍵 (A和B) 并僅獲取原始字符串。

TA貢獻1794條經(jīng)驗 獲得超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()方法獲取字符串所屬的組。
使用一組來跟蹤已經(jīng)訪問過的組。
如果一個組不在集合中,則將其添加到集合中,并將當前字符串添加到該組的答案中(因為這將是最后一次出現(xiàn))。
最后,返回列表。
添加回答
舉報