Java 8 機能を使用して、リストをセットに変換する代わりに、リスト内の重複を尊重するアルゴリズムを次に示します。並べ替えがないので、いいえn log n
。
- リストの 1 つをマップに変換します。値は出現回数 (コスト: O(n)) です。
- 他のリストの各アイテムについて、そのアイテムがマップに存在する場合、発生を 1 つ減らします (コスト: O(n))。
したがって、全体のコストは O(n) です。コード:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Dup {
public static void main(String[] args) {
List<Integer> listA = Arrays.asList(3, 1, 4, 1, 9, 5, 9);
List<Integer> listB = Arrays.asList(2, 6, 5, 3, 5, 8, 9, 7, 9, 3, 2, 3);
findCommons(listA, listB);
}
static void findCommons(List<Integer> listA, List<Integer> listB) {
Map<Integer, Long> mapA =
listA.stream().collect(
Collectors.groupingBy(Integer::intValue, Collectors.counting()));
List<Integer> commons = new ArrayList<>();
listB.stream()
.filter(e -> mapA.get(e) != null)
.filter(e -> mapA.get(e) > 0)
.forEach(e -> {
mapA.put(e, mapA.get(e) - 1);
commons.add(e);
});
System.out.println(commons);
}
}
上記のコードにより、次の出力が得られます[5, 3, 9, 9]
。