2012-10-16 18 views
6

Java sınıfım için bir metin belgeleri dizini karşılaştırmak üzere hashSets kullanmak istediğim bir programım var. Esasen, planım, her bir kağıt için bir dizi hashSet'i oluşturmak ve ardından hashSets öğelerinden ikisini birlikte bir hashSet'e eklemek ve aynı 6 sözcük dizisinin sayısını bulmaktır.Java'da HashSet Çakışması

Sorum şu: Benim için el ile denetlemeli ve işlemek zorunda mıyım, yoksa Java bunu benim için mi yapmalı?

+1

Size burada bulabilirsiniz (http://stackoverflow.com/questions/4980757/how-do-hashtables-deal-with-collisions) –

cevap

3

Java Karma Haritalar/Setler Otomatik olarak Hash çakışmaları el ile, bu nedenle hem equals hem de hashCode yöntemlerini geçersiz kılmak önemlidir. Her ikisi de Double veya benzersiz girdileri ayırt etmek için Sets tarafından kullanılır.

Ayrıca, aynı karma tarafından birden çok nesneye başvurulduğundan, bu karma çarpışmaların bir performans düşümü olduğunu unutmayın.

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; 
} 
} 
} 

Not: Standart Java zaten hashCode uygulamış böyle String olarak Nesneleri ve böylece sadece veri nesneleri kendi tür yapmak zorunda eşittir.

+0

Tamam, havalı. HashMaps'in dahili çarpışma işlemesi olduğunu söyleyen çok sayıda yayın yeri okudum, ancak HashSets'in yerleşik bir çarpışma işlemine sahip olduğunu özellikle belirten bir şey bulamadım. – marcinx27

+0

Lütfen benim düzenlememize dikkat edin: hashCode ve equals yöntemlerinin her ikisini de geçersiz kılmak önemlidir, çünkü her ikisi de setlerin kopyalarını tanımlamak için kullanılır. – dngfng

+0

Ne demek istiyorsun? – marcinx27

0

Sanırım karma çarpışmalar istemedin değil mi? Soru, HashSet a ve HashSet b'nin tek bir kümeye eklendiği zaman ne olduğudır. a.addAll (b) tarafından.

Yanıt, tüm öğeleri içerecek ve çoğaltma içermeyen bir istemdir. Strings durumunda bu, add + a.size() 'den önce + b.size()' den sonra a.size() ile setlerden eşit String sayısını sayabilirsiniz.

Bazı Dizeler aynı karma kodu var, ancak eşit değil bile fark etmez.

+0

Yalnızca Set'e String nesneleri eklediğinizde veya hashCode ve equals'ı zaten uygulamış olan diğer nesneler varsa doğrudur. Kendi Nesneye sahipseniz, her ikisini de mutlaka uygulamak zorunda kalacaksınız. – dngfng

+0

Çeşit. Demek istediğim, eğer a.addAll (b) yaparsam, herhangi bir kopyanın olmayacağından ve a ve b'deki her bir özel dizinin orada olacağından emin olduğumdan emin olmaktır. – marcinx27

+0

@dngfng Eğer dizeleri kullanıyorum, çarpışmalara bakmaya ihtiyacım yok. Tüm dizeleri hashSet'lerine yerleştirebilirim ve benzersiz olan her şeyin orada olduğundan ve kopyalarının bulunmadığından emin olabilir miyim? – marcinx27