假設我有Set<List<String>>像這樣
["A"/span>, "B"/span>, "C"/span>, "D"/span>, "E"/span>]
["A"/span>, "B"/span>, "C"/span> "D"/span>, "F"/span>]
["G"/span>, "K"/span>, "P"/span>, "C"/span>]
["Z"/span>, "C"/span>, "R"/span>, "D"/span>]
["F"/span>, "Z"/span>, "U"/span>]
當比較階段開始時,我想丟棄所有串列中的第一個專案。
["B"/span>, "C"/span> "D"/span>, "E"/span>]
["B"/span>, "C"/span> "D"/span>, "F"/span>]
["K"/span>, "P"/span>, "C"/span>]
["C"/span>, "R"/span>, "D"/span>]
["Z", "U"]
(我設法實作了這個修飾,感謝jhyot的評論)
新的集合應該是這樣的,然后我想抓取第一個串列的第一個專案 "B",并逐一比較其他串列的專案。
comparision(first list's "B" -> second list's "B", "C", "D", "F", "K", "P", "C", "R", "D", "Z", "U")
當 "B "的比較完成后,計算出現的次數(在這個例子中是1),在另一個串列/集合中只增加一個重疊的值,等等
。# Overlap # Number
[( 0 : null) ]
[( 1 : null) ]
[( 2 : null) ]
[( 3 : null) ]
[( 4 : null) ]
[( 5 : null) ]
[( 6 : null) ] 。
...
當"B"比較完成 (這是在其他串列中找到一次增加1重疊1。
# 重疊 # 數量
[( 0 : null)]
[( 1 : 1) ]
[( 2 : null) ]
[( 3 : null) ]
[( 4 : null) ]
[( 5 : null) ]
[( 6 : null) ] 。
...
當第一個串列專案完成并計數后,繼續進行第一個串列的第二個專案("C")并與另一個串列進行比較,然后繼續。
comparision(first list's "C" -> 第二個串列的"B"/span>, "C"/span>, "D"/span>。"F"/span>, "K"/span>, "P"/span>。"C", "C", "R", "D"/span>, "Z"/span>, "U"/span>)
比較(第一個串列的 "D" -> 第二個串列的"B"/span>, "C"/span>, "D"/span>。"F"/span>, "K"/span>, "P"/span>, "C", "C", "R", "D"/span>, "Z"/span>, "U"/span>)
比較(第一個串列的 "E" -> 第二個串列的"B"/span>, "C"/span>, "D"/span>。"F"/span>, "K"/span>, "P"/span>。"C", "C", "R", "D"/span>, "Z"/span>, "U"/span>)
comparision(second list's "B" -> "K", "P", "C", "R", "D", "Z", "U")
comparision(second list's "C" -> "K"/span>, "P"/span>, "C"/span>, "C"/span>, "R"/span>, "D"/span>, "Z"/span>, "U"/span>)
...
到目前為止,我所做的嘗試
我使用了Collections.fruquency,但是我不知道如何丟棄每個串列的第一個專案。我寫了自定義函式,成功地處理了串列中的專案,但我失去了串列的資訊。
"A"
"B"/span>
"C"/span>
"D"/span>
"E"/span>
"A"/span>
"B"/span> "B"/span>
"C"/span>
...
在這種形狀下,我認為不能進行比較。但我還是不知道如何修剪第一項。
uj5u.com熱心網友回復:
- 放棄每個串列中的第一個元素 。
這可以通過使用List::remove(int index)
Set<List<String>> lists = ...; //定義了一個串列集。
List<List<String>> withoutFirst = new ArrayList<>(lists)。
withoutFirst.forEach(list -> {if (!list.isEmpty()) list.remove(0); })。
或者可以使用List::subList(https://docs.oracle.com/javase/8/docs/api/java/util/List.html#subList-int-int-) 創建每個串列的副本:
List<List<String>> withoutFirst = lists
.stream()
.filter(list -> !list.isEmpty())
.map(list -> list.subList(1, list.size())
.collect(Collectors.toList())。
- 計算每個元素的出現次數可以按以下方式實作: 。
for (int i = 0, n = withoutFirst. size(); i < n - 1; i ) {
List<String> remainder = withoutFirst
.subList(i 1, n)
.stream() // Stream<List<String> >
.flatMap(List::stream) // Stream<String>
.collect(Collectors.toList())。
Map<String, Integer> frequencies = withoutFirst.get(i)
.stream() //span> .
.collect(Collectors.toMap(
x -> x,
x -> Collections.frequency( remainder, x)
));
}
關于重疊和進一步使用計算頻率的部分還有待澄清。
uj5u.com熱心網友回復:
獲取串列并從所有子串列中排除第1個元素
Set<List<String>> dataSet = Test.getList()。
//Exclude 1st Element from all sub-lists。
List<List<String>> withOutFirstElement = dataSet.stream()
.map(item -> item.subList(1, item.size())
.collect(Collectors.toList())。
要計算出現的次數 :
//Map which keeps track of Every string in current sublist with its occurrences。
Map<String, Long> occurrencesMap = new LinkedHashMap<>()。
for (int i = 0; i< withOutFirstElement.size(); i ) {
//獲得子串列的執行。
List<String> subList = withOutFirstElement.get(i);
//迭代當前選定的子串列
for (String searchedItem : subList) {
long count = 0;
//迭代每個子串列,不包括當前子串列,因為k 1。
//得到匹配的出現次數。
for (int k = i 1; k < withOutFirstElement.size(); k ) {
count = withOutFirstElement.get(k)
.stream().filter(item -> Objects.equals(item, searchedItem)).count()。
}
if(occurrencesMap.containsKey(searchedItem)){
occurrencesMap.put(searchedItem, occurrencesMap.get(searchedItem) count)。
}else{
occurrencesMap.put(searchedItem, count);
}
}
}
System.out.println(occurrencesMap)。
// {B=1, C=6, D=3, E=0, F=0, K=0, P=0, R=0, Z=0, U=0}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/308841.html
標籤:
