2012-10-16 15 views
6

Mam program dla mojej klasy Java, w której chcę użyć hashSets do porównania katalogu dokumentów tekstowych. Zasadniczo, moim planem jest stworzenie hashSet ciągów dla każdego papieru, a następnie dodanie dwóch kart hashSet razem do jednego hashSet i znaleźć liczbę takich samych 6-wyrazowych sekwencji.Kolizje HashSet w Javie

Moje pytanie brzmi: czy muszę ręcznie sprawdzać i obsługiwać kolizje, czy Java robi to za mnie?

+1

Możesz znaleźć cię ans [tutaj] (http://stackoverflow.com/questions/4980757/how-do-hashtables-deal-with-collisions) –

Odpowiedz

3

Java Hash Mapy/zestawy Automatycznie handlują kolizje Hash, dlatego ważne jest, aby zastąpić metody equals i hashCode. Ponieważ obie są wykorzystywane przez zestawy do rozróżniania duplikatów lub unikatowych wpisów.

Należy również zauważyć, że te kolizje ha ha są implozją wydajności, ponieważ wiele obiektów odwołuje się do tego samego skrótu.

public class MyObject { 
private String name; 

//getter and setters 


public int hashCode() { 
    int hashCode = //Do some object specifc stuff to gen hashCode 
    return int; 
} 

public boolean equals(Object obj) { 
    if(this==obj) return true; 
    if(obj instanceOf MyObject) { 
     if(this.name.equals((MyObject)obj.getName())) { 
      return true; 
     } 
    return false; 
} 
} 
} 

Uwaga: Standardowy Java Przedmioty takie jak String wdrożyły już hashCode i równa, więc trzeba tylko to zrobić dla własnego rodzaju obiektów danych.

+0

Okay, fajnie. Czytałem sporo miejsc postów mówiących o tym, że HashMaps ma wbudowaną obsługę kolizji, ale nie mogłem znaleźć niczego, co by wyraźnie wskazywało, że HashSets ma wbudowaną obsługę kolizji. – marcinx27

+0

Proszę zauważyć, że moja edycja: ważne jest, aby przesłonić zarówno metody hashCode, jak i równe, ponieważ oba te są wykorzystywane przez zestawy do identyfikacji duplikatów. – dngfng

+0

Co masz na myśli? – marcinx27

0

Myślę, że nie prosiłeś o kolizje hash, prawda? Pytanie brzmi, co się stanie, gdy HashSet a i HashSet b zostaną dodane do jednego zestawu, np. autor: a.addAll (b).

Odpowiedź jest testem zawierającym wszystkie elementy i bez duplikatów. W przypadku Ciągów oznacza to, że można policzyć liczbę równych Ciągów z zestawów za pomocą a.size() przed add - a.size() po dodaniu + b.size().

Nie ma nawet znaczenia, czy niektóre z Ciągów mają ten sam kod skrótu, ale nie są równe.

+0

Jest to prawdziwe tylko wtedy, gdy dodajesz obiekty String do Seta lub innych obiektów, które już zaimplementowały hashCode i są równe. Jeśli masz własny obiekt, zdecydowanie będziesz musiał wdrożyć oba. – dngfng

+0

Rodzaj. Mówię tylko, że jeśli zrobię a.addAll (b), czy jest pewne, że nie będę miał żadnych duplikatów i czy jest pewne, że będzie tam każdy unikalny ciąg znaków od aib? – marcinx27

+0

@dngfng Więc jeśli używam ciągów znaków, nie muszę sprawdzać kolizji. Mogę po prostu włożyć wszystkie struny do ich zestawów hash i mieć pewność, że wszystko jest tam unikalne i że nie ma duplikatów? – marcinx27