6 Ağustos 2019 Salı

Set Algoritmaları

farkları eşitmele
Birinci set üzerinde yürü ve elemanı al
Eğer eleman ikinci set üzerinde yoksa ikinci set'e ekle

İkinci set üzerinde yürü ve elemanı al
Eğer eleman birinci set üzerinde yoksa elemanı sil

intersection
Örnek - İki Liste
Şöyle yaparız. Burada birinci liste değişikliğe uğrar.
list1.retainAll (list2);
Örnek
Şöyle yaparız. İki liste birleştirilerek bir Set oluşturulur. En kolayı bence bu.
List<T> union = Stream.concat(list1.stream(), list2.stream())
  .distinct()
  .collect(Collectors.toList());
Örnek - Bir Set + Bir Liste
Şöyle yaparız. Birinci liste Set'e dönüştürülür. Bu yöntem aramada O(1) olduğu için hızlıdır. 
Set<String> ids = list2.stream().map(obj -> obj.id).collect(Collectors.toSet());

List<MyObject> intersect = list1.stream()
    .filter(obj -> ids.contains(obj.id))
    .collect(Collectors.toList());
Örnek - Farklı Tipte İki Set
Şöyle yaparız. Eğer A ve B nesneleri farklı tiplerse, B'yi A tipine çeviren bir metoda ihtiyacımız var. Bunu çevirimi filter() metodunda kullanıyoruz. Bu yöntem aramada O(1) olduğu için hızlıdır.
Set<String> changedNames = collectionB.stream()
  .filter(b -> collectionA.contains(b.toA())
  .map(item -> item.getName()).collect(toSet());
Örnek - İki Liste
Şöyle yaparız. Bu yöntem aramada O(n^2) olduğu için biraz daha verimsiz olabilir. Birinci listede çift elemanlar varsa hızlandırmak için önce distinct() sonra filter() yapılabilir.
public class MyObject {
     String id;
     String someField;
     String someOtherField;
}

List<MyObject> list1;
List<MyObject> list2;

List<MyObject> intersect = list1.stream()
  .filter(list2::contains)
  .collect(Collectors.toList());

Hiç yorum yok:

Yorum Gönder