2016-03-21 24 views
0

Ne tür bir veri toplama topluluğudur, HashSet'in contains yönteminin sabit zaman işlevselliğini sağlar ve get ArrayList yöntemine benzeyen endeksle sabit zamanlı arama sağlar? Java API böyle bir şey içeriyor mu? TreeSet'i kullanmayı düşündüm, ancak Java Docs'a göre bu işlemler O (log n).Java Siparişi Hasebiyle Toplama

+0

A ['LinekdHashSet'] (https://docs.oracle.com/javase/8/docs/api/java/util/LinkedHashSet.html) belki? – Mureinik

+0

Sabit zamanlı eklemeye mi ihtiyacınız var? Eğer öyleyse, bu işe yaramayacaktır, çünkü böyle bir veri yapısı O (n) zamanında bir karşılaştırma yapmanıza izin verir. – user2357112

+2

"Sıralı" derken, sıralı sipariş mi demek istiyorsunuz yoksa ekleme siparişi gibi başka bir sipariş mi demek istiyorsunuz? – user2357112

cevap

0

LinkedHashSet'u kullanın. Kestirilebilir yineleme sırası ile Set tablosunun Karma tablosu ve bağlantılı liste uygulamasıdır.

Karma (set) kümesindeki bir öğenin varlığını kontrol etmek veya kontrol etmek için O (n) karmaşıklığına kadar göreceksiniz. Ancak çoğu zaman çarpışma görmüyorsunuz ve çoğu durumda O (1) olacaktır.

+1

BağlantılıHashSet destek endeksleme yapmıyorsa, bazı sıralanmış yapı için O (1) rastgele erişim elde edilebileceğinden şüphe duyuyorum. – Aroto

+0

Set arayüzünde indexOf() veya get() gibi herhangi bir doğrudan yöntem yoktur. Bir öğe aramak için tüm koleksiyonu ayrıştırmanız gerekir. indexOf() ve get() dahili olarak sadece aynısını yapar. – FallAndLearn

+1

OP, indeks * ile sabit zaman eleman alımı * talep eder. LinkedHashSet, sabit zaman kazanma özelliği sunsa da, yalnızca indeks değil, yalnızca anahtardır. –

1

Java standart kitaplığı böyle bir sınıf sunmuyor, ancak çok fazla sorun yaşamadan kendi başınıza uygulayabilirsiniz. LinkedHashSet'un iki ya da daha azı olacaktır: List (ArrayList), sabit zamanlı işleme için dahili bir HashSet korur.

Koleksiyonlar API'sı, toplama sınıflarının uygulanmasını kolaylaştırmayı amaçlayan sınıflara sahiptir; Bu durumda, AbstractList'un bir beton alt sınıfını uygulamaya bakacağım.

Güncelleme

: senin fikrin örnekleri otomatik onlar yinelenen unsurları izin vermemek ve/veya sırayla kendi elemanları korumak ise, o zaman ne bahsettiğinizi hiç bir List Öte yandan değil . Bu durumda, indekslenmiş alım yöntemlerini ekleyen AbstractSet numaralı bir alt sınıfın uygulanmasını düşünmek istersiniz. Hala bir HashSet ve bir ArrayList sarabilirsiniz, ancak listeyi öğe ekleme konusunda sıralamak için biraz çaba harcamanız gerekir.