Bu tür liste / harita için bir veri yapısı var mı?


22

Belki de istediklerim için bir isim var, ama farkında değilim. LinkedHashMapJava'dakine benzer bir şeye ihtiyacım var , ancak belirtilen anahtarda bir değer yoksa, 'önceki' değerini döndürür.

Yani, bir tamsayı anahtarının (benim durumumda zaman birimlerinde olan) sakladığı nesnelerin bir listesi var:

; key->value
10->A
15->B
20->C

Bu yüzden, 0-9 anahtarının değerini sorgulayacak olsaydım, geri dönerdi null. Özel kısım, eğer 10 <= i <= 14 olan bir şey için sorguladıysam, A döndürürdü. Veya, i> = 20 için C döndürürdü.

Bunun için bir veri yapısı var mı?


Uygulamalı bir uygulama olup olmadığını bilmiyorum ama muhtemelen bunu yapmak için mevcut olanı uzatabilirsiniz. Performans hedeflerinize ulaşıp ulaşamayacağını bir yeniden yazma olmadan bilmiyorum ...
Rig

1
Büyük soru için +1. Üç düşük basamaklı temsilcisi olan çoğu kişi "lütfen ödevimi yap" sorusunu sorar. Buradaki durum değil.
Tulains Córdova

Yanıtlar:


33

Bir NavigableMap arıyorsunuz . Bu, sıralanan haritanın doğasının yanı sıra bazı işlevleri olan SortedMap'in bir alt türüdür. Gezinilebilir haritanın "SortedMap arayüzünün yerini alması gerektiğini" unutmayın. ( Java SE 6 Koleksiyonlar Çerçeve Geliştirmeleri ). Şu anda uygulayan her şey SortedMapuygular NavigableMapve bunun gerçek kalması muhtemeldir.

Özellikle, floorKey(K key)"en büyük anahtarı verilen anahtardan daha küçük veya ona eşit olan veya bu tür bir anahtar yoksa null değerini veren yöntem.

Bu, haritanın belirli anahtarlarını veya alt haritalarını almanızı sağlayan birçok yöntemden yalnızca biridir.

  • tavan / zemin (parametreden daha yüksek / daha düşük olan giriş)
  • azalan sırada tuşlara veya haritaya erişme
  • head / tail (girişler verilen tuşlardan daha küçük / büyük)
  • daha yüksek / daha düşük (bir sonraki anahtar parametreden daha yüksek veya daha düşük)
  • submap (iki anahtar verildiğinde, iki anahtar arasındaki haritayı döndürün)

Java'nın NavigableMap uygulamasında iki uygulaması vardır - TreeMap ve ConcurrentSkipListMap .

Bir atlama listesinin fikrine / uygulanmasına bakarsanız, bunun neden böyle bir yapı ve sorgularla gerçekten iyi sonuç verdiğini göreceksiniz.


1+ harika cevap. Java API'sinde böyle bir haritanın var olduğunu hiç düşünmedim.
Tulains Córdova

@ user61852 En sevdiğim veri türü, atlama listesi ve etrafa düştüm. 1.6'da uygulandığını gördüğümde, ne sağladığına baktım ve sahip olduğu arayüzleri ve dolayısıyla ona aşina olduğumu fark ettim.

Beni ikna eden şeylerden biri de Java bulabileceğiniz en iyi tasarlanmış dillerden biri.
Tulains Córdova

1
Bu OP'nin konusunu ele alıyor gibi LinkedHashMapgözükse de , bahsettiği gibi davranmadığını unutmayın . Ne eklenir TreeMapne de ne ConcurrentSkipListMapzaman eklenir LinkedHashMap, aksine bir Comparatoranahtarın veya uygularsa Doğal Düzen tarafından verilir Comparable.
MikeFHay

1
Çok iyi bir nokta. Zemin operasyonu aradığım şeydi, karşılaştırıcıyı kolayca ekleyebilirim. Ve benim durumumda, tekerleği yeniden icat etmek yerine karşılaştırıcıyı uygulamak çok daha iyi sonuç veriyor. Teşekkürler.
Nick

1

Aradığın, sipariş edilen işlemleri destekleyen bir sembol tablosu. Ve senin durumunda bu kat operasyonu.

Bir sembol tablosunun karma uygulaması en hızlıdır ancak bu sipariş edilen işlemleri sunmaz.

Ancak sembol tabloların ağaç uygulaması yapar. Java'da buna bir örnek, TreeMap sınıfıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.