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
cevap
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.
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
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
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. –
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.
: 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.
A ['LinekdHashSet'] (https://docs.oracle.com/javase/8/docs/api/java/util/LinkedHashSet.html) belki? – Mureinik
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
"Sıralı" derken, sıralı sipariş mi demek istiyorsunuz yoksa ekleme siparişi gibi başka bir sipariş mi demek istiyorsunuz? – user2357112