SORU
17 ŞUBAT 2009, Salı


Eğer bir ArrayList nesnesi içerip içermediğini en verimli şekilde Java

Java nesneleri bir ArrayList var. Nesneleri nesne diğerine eşit düşünün için kullanmak istiyorum iki dört alan var. Eğer dizi nesne varsa görmek için bu iki alanda verilen en etkili yolu arıyorum.

Anahtarı bu sınıflar YANITLANAN nesneleri dayalı olarak oluşturulan, sınıflarını .equals üzerine yazmak için değiştirmek istemiyorum.

Daha iyi sadece döngü ve el ile her nesne için iki alanı karşılaştırmak ve o zaman bulduğunda kırma yolu daha var mı? Çok dağınık, daha iyi bir yol arıyor gibi görünüyor.

Düzenleme:ArrayList nesneleri içine döndürülür bir SOAP yanıt geliyor.

CEVAP
17 ŞUBAT 2009, Salı


Ne kadar etkili şeyler olması gerekir bağlıdır. Sadece belirli bir koşula uygun olan liste elemanı arıyor yineleme üzerinde O(n), ama ArrayList.Eğer uygulamak olabilir içeriyorsa Equals yöntemi. Eğer döngüler veya iç döngüler yapıyorsan bu yaklaşım muhtemelen gayet iyi.

Eğer gerçekten çok verimli-Yukarı Bak ne pahasına olursa olsun hız gerekiyorsa, iki şey yapmanız gerekir:

  1. Sınıf gerçeğini bir çözüm oluşturulur: adaptör bir sınıf Yazmak can şal oluşturulan sınıf ve equals() uygulamaları bu iki alan üzerinde (onlar varsayarak ortak). Ayrıca unutma hashCode() ( * ) uygulamak
  2. Her adaptör ve nesne kaydırma bir HashSet koy. HashSet.contains() Sabit vardır erişim, yani O(1) yerine, O zaman(n).

Tabii ki, bu bina hala HashSet(n) bir maliyeti vardır. Yalnızca HashSet binanın maliyeti içerir toplam maliyeti karşılaştırıldığında önemsiz ise hiçbir şey elde edeceksin() yapmanız gereken denetler. Yineleme olmadan bir liste oluşturmaya çalışırken böyle bir dava.


* (Uygulama hashCode() en iyi tarafından yapılıyor bence XOR (^ operatör) hashCodes aynı alanları kullanarak eşit uygulama (ama multiply by 31 azaltmak için şans XOR getirisi 0)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bryan Adams

    Bryan Adams

    30 Mart 2006
  • DigitalRev TV

    DigitalRev T

    30 AĞUSTOS 2007
  • The White House

    The White Ho

    21 Ocak 2006