24 Haziran 2020 Çarşamba

HashSet Sınıfı - Comparator Verilemez

Giriş
Şu satırı dahil ederiz.
import java.util.HashSet;
Set arayüzünden kalıttığı için şöyle yaparız.
Set<Integer> set = new HashSet<>();
Comparator
Bu sınıfa Comparator verilemediği için TreeSet tercih edilebilir.

Örnek
Şöyle yaparız
TreeSet<String> treeSet = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
HashSet<String> hashSet = new HashSet<>();
treeSet.addAll(List.of("A", "b"));
hashSet.addAll(List.of("A", "B"));
System.out.println(hashSet.equals(treeSet)); // false
System.out.println(treeSet.equals(hashSet)); // true
Açıklaması şöyle. TreeSet açısından HashSet'teki tüm elemanlar kendinde mevcut çünkü Comparator kullanıyor.
The reason for this is that a TreeSet uses comparator to determine if an element is duplicate while HashSet uses equals.
constructor - default
Şöyle yaparız.
HasSet<Integer> set = new HashSet<>();
constructor - capacity + loadfactor
Bu sınıf altta HashMap Sınıfını kullanır. Metodun için şöyledir.
public HashSet(int initialCapacity, float loadFactor) {
    map = new HashMap<>(initialCapacity, loadFactor);
}
Şöyle yaparız.
HashSet <Integer> set = new HashSet<> (10,0.5);
constructor  - Collection
Metodun içi şöyle. Önce bir map oluşturulur. Daha sonra her şey map'e eklenir.
public HashSet(Collection<? extends E> c) {
  map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
  addAll(c);
}
Örnek
Listeyi ekleyerek çiftleri elememek için şöyle yaparız.
Set<String> set = new HashSet<>(list);
add metodu
Ekleme başarılı ise true döner. Değer zaten varsa false döner.
Örnek
Şöyle yaparız.
HashSet<Integer> set = ...;
int item = ...;
if (!set.add(item)) {
  //Duplicate;
}
Daha kolay anlaşılır kod için şöyle yapmak gerekir.
boolean added = set.add(entry);

if (added) {
    //do some more stuff
}
Metodun içi şöyledir. PRESENT dummy bir değerdir.
public boolean add(E e) {
  return map.put(e, PRESENT)==null;
}
addAll metodu
Listeyi ekleyerek çiftleri elememek için şöyle yaparız.
set.addAll(list);
removeAll metodu
over200 olanları geri kalandan silmek için şöyle yaparız.
Set<Laptops> over2000 = ...;
Set<Laptops> rest = ...;
rest.removeAll(over2000);
retainAll metodu
İki set'in kesişimini verir.
Örnek
Şöyle yaparız.
public Integer[] intersection(int[] nums1, int[] nums2) {

  HashSet<Integer> set1 = new HashSet<>();
  for(int i : nums1) {
    set1.add(i);
  }

  HashSet<Integer> set2 = new HashSet<>();
  for(int i : nums2) {
    set2.add(i);
  }

  set1.retainAll(set2);

  return set1.toArray(new Integer[set1.size()]);
}
Örnek
Elimizde iki dizi olsun nums1 = [1, 2, 2, 1], nums2 = [2, 2],
Çıktı olarak kesişim olan [2] sonucunu alırız.

Örnek
Şöyle yaparız.
Set<String> set1 = new HashSet<String>(coll1);
Set<String> set2 = new HashSet<String>(coll2);

set1.retainAll(set2); //gives me an empty set
toArray metodu - T[]
Girdi olarak verilen array HashSet'in büyüklüğünden küçükse yeni bir array döner.
Örnek
Elimizde şöyle bir kod olsun.
Set<Integer> x = new HashSet<>();
x.add(4);
Şöyle yaparız.
Integer[] arr = x.toArray(new Integer[x.size()]);
Diğer
HashSet'in Kendini İçermesi
Açıklaması şöyle.
"it is not permissible for a set to contain itself as an element"
Açıklaması şöyle.
Some collection operations which perform recursive traversal of the collection may fail with an exception for self-referential instances where the collection directly or indirectly contains itself. This includes the clone()equals()hashCode() and toString() methods. Implementations may optionally handle the self-referential scenario, however most current implementations do not do so.
Şöyle yapmamak lazım.
Set<Object> mySet = new HashSet<>();
mySet.add(mySet);
Şöyle de yapmamak lazım.
Set<Object> setA = new HashSet<Object>();
Set<Object> setB = new HashSet<Object>();
setA.add(setB);
setB.add(setA);




Hiç yorum yok:

Yorum Gönder