2009-12-08 24 views
8

Ayrıca Set olan bir PriorityQueue uygulama arıyorum. Öğeleri, öğelerinin equals'un uygulanmasıyla tutarlı olma zorunluluğu olmaması durumunda, compareTo uygulamasının compareTo uygulaması.Ayrıca bir Set olan bir Queue (PriorityQueue) uygulaması var mı?

Java için böyle bir uygulama var mı?

Güncelleme: şimdi iç koleksiyon olarak bir SortedSet kullanarak uyguladı. Bu yüzden sadece kuyruk arabirimini karşılamak için eksik yöntemleri uygulamak zorunda kaldım. Ayrıca, sınırlı bir sıra olması gerektiğini de unutmuşum, bu yüzden kapasiteye sahip ve kapasiteye ulaşıldığında setin son elemanını atıyor. dolayısıyla ben birinin bulunduğunu sanmıyorum

cevap

1

Eh PriorityQueueComparitor veya sıralama için öğelerin doğal sipariş bağımlı kendisi gidiyor, aynı şekilde Set doğal sıralamada veya Comparitor fonksiyonuna bağlı olacaktır Java yüklemek varsayılan bir parçası ... olarak

Ama hız basitçe aka ... vb

istediğiniz arabirimi yerleştirilerek ve onların doğal destek malzemelerini kullanarak bir endişe değilse muhtemelen oldukça kolay bir tane yaratabilir
MyQueueSet extends PriorityQueue implements Set { 
    HashSet set; 
    ... 
} 

Ne yazık ki Java'nın java.util . * veri kümesi sınıfları her zaman kodlarının parçalarını yeniden yazmadan genişletmek için en kolay değildir.

PriorityQueue Destek malzemesi bu şekilde yeni bir öğe sokulması ve daha sonra bir contains(e) testi yapmak, elemanlar bir yığın kriteri listesi olacak kuyruk göre, sıralama için bir O (n) ara veri değeri değil, eğer Set işlevselliğini desteklemek için bir HashSet eklersiniz, arama veri kümesini iki kez saklamak pahasına arama sürenizi çok daha fazla geliştirebilirsiniz (Java'nın değerden geldiğini ve tüm nesnelerin yığında olduğunu unutmayın). Bu büyük bir kümenin performansını artırmalıdır. Eğer sadece yinelenen girişleri kabul etmek istemiyoruz iaw bir 'Set-benzeri davranışları, bir kuyruk yaratmak için yeterli ise

+0

ancak nesneler sıra ve set arasında paylaşılmaz ... bunlar tamamen ilişkisizdir ... bu bir çeşit (yanlış) çoklu kalıtım mıdır? – dfa

+0

@dfa Nesneler, sıra ve set arasında paylaşılıyor ... sadece referansları iki set halinde saklanıyor ... Benim önerim, @Andreas_D ile aynıdır - Java koleksiyonlarında kullanılan çok yaygın bir çözümdür. Java'nın koleksiyonları daha kolay genişletilebilecek ve kendi yarattığınız koleksiyonlar o kadar kolay olmazsa ... – Petriborg

+0

Bu bana pek bir şey ifade etmiyor. Bir öncelik sırası zaten sıralanmıştır, bu yüzden yalnızca normal bir kümeye ihtiyacınız olacaktır. Dahası bence, iki koleksiyona sahip olmanın yükü yüksek olacaktı, nesnelerim nispeten küçüktü, ama bende çok fazla var. – Mauli

6

, sonra düşünüyorum, kolay bir çözüm PriorityQueue alt sınıfı ve add(), addAll() geçersiz kılmak olabilir ve benzeri offer() yöntem: BTW

@Override 
public boolean offer(E e) { 
    if (contains(e)) { 
    return false; 
    } else { 
    return super.offer(e); 
    } 
} 

- add() aramalar offer() içten, belki sadece offer() yöntemini geçersiz ve orada kontrol yapmak bile yeterli.

+2

Bu düşündüğüm bir ihtimal. Sadece birisinin böyle bir koleksiyonu zaten uygulamış olabileceğini düşündüm. – Mauli

0

PriorityQueue bir SoyutKoleksiyonudur - bu, bir Küme için hemen hemen aynı bir arabirime sahiptir. Set'e bir PriorityQueue dönüştüren bir sarıcı yapmak kolay olurdu. Bunu gerçekten zorlamanız gerekiyorsa, çiftleri önlemek için eklenmiş bir öğe karma tablosunu tutabilirsiniz.

PriorityQueue, compareTo'nun eşittir ile tutarlı olmasını gerektirdiğini düşünmüyorum. PriorityQueue hiçbir şekilde eşittir (miras alınan AbstractCollection işlemleri hariç).

+0

Hayır, PriorityQueue tutarlılık kısıtlamaları yoktur, ancak sıralı bir dizi yapar. Ve aynı öğeleri tutan iki koleksiyona sahip olmak istemiyorum. – Mauli

2

TreeSet, düzenli yineleme sağlayan bir kümedir.Bu, iterator yöntemiyle döndürülen yineleyicinin, kümenin öğelerini, doğal düzenleriyle (Comparable aracılığıyla) veya oluşturulduğunda kümeye verilen bir karşılaştırıcı tarafından belirlenen şekilde artan bir sırada döndürmesini garanti eden SortedSet arabirimini uygular.

İlgili konular