Java Set tutma sırası?


179

Java Kümesi düzeni koruyor mu? Bir yöntem bana bir Küme döndürüyor ve sözde veriler sıralanıyor, ancak Küme üzerinden yineleniyorsa, veri sırasız. Bunu yönetmenin daha iyi bir yolu var mı? Kümeden başka bir şey döndürmek için yöntemin değiştirilmesi gerekiyor mu?


3
"Öğeler belirli bir sıraya göre döndürülmez (bu küme bir garanti sağlayan bir sınıf örneği değilse)." bir kümenin yineleyici yönteminin söylediği şey budur. burada
keyser

Yanıtlar:


256

SetArayüz herhangi sipariş garanti vermemektedir.

Alt arayüzü SortedSetbazı ölçütlere göre sıralanan bir kümeyi temsil eder. Java 6'da, uygulayan iki standart kap vardır SortedSet. Onlar TreeSetve ConcurrentSkipListSet.

Arayüze ek olarak SortedSet, LinkedHashSetsınıf da vardır . Öğelerin kümeye eklenme sırasını hatırlar ve öğelerini bu sırayla döndürür.


21
Ayrıca, Java 8'deki farklı String karma nedeniyle , Kümeler ve Haritalar'daki varsayılan (sıralanmamış) sıralama değişecektir. Sıralanmamış siparişe güveniyorsanız, kodunuz Java 8 altında farklı davranacaktır.
rustyx

Sınıfın sıralamasının normal olduğunu anlıyorum, ancak beklediğim davranış, tanıtıldıkları gibi onları terk etmek ve siparişle uğraşmamaktı, bunun yerine her biri bir araya getirildiğinde öğeleri karıştırıyordu. Çözümünüz en iyi şekilde kalmamaktır, çünkü o zaman tanıtıldıkları AYNI YOL için sıralanmaları için bütün bir yapıyı uygulamak zorunda kalacağım: S
White_King

@White_King: Bir küme, "araya ekleme sırası" kavramını içermeyen matematiksel bir kavramdır, bu nedenle Java arabiriminin kurallarına uyması mantıklıdır. Sıralı kümeler vardır, ancak düzen yine küme teorisindeki tanımı Java'daki tanımla eşleştiren bir ilişki (Java'da karşılaştırıcı) ile belirtilir. Ekleme sırasını tutma beklentiniz büyük olasılıkla listelerden gelir, ancak kümeler liste değildir.
Konrad Höffner

103

LinkedHashSet ihtiyacınız olan şey.


43
A Listbir değildir Set(üyeliğin benzersizliğini garanti etmez).
Sınırlı Kefaret

10
Birçok ticari benzersiz durumda Liste, yalnızca Set yerine siparişi korumak için kullanılamaz. LinkedHashSet, siparişi korur ve benzersiz depolar.
gubs

18

Üyelerin birçoğunun önerdiği gibi, koleksiyonun sırasını korumak için LinkedHashSet kullanın. U, bu uygulamayı kullanarak setinizi sarabilir.

SortedSet uygulaması sıralı sipariş için kullanılabilir, ancak amacınız için LinkedHashSet kullanın .

Ayrıca dokümanlardan,

"Bu uygulama, müşterilerini TreeSet ile ilişkili artan maliyete maruz kalmadan HashSet tarafından sağlanan belirtilmemiş, genellikle kaotik siparişten ayırır. Orijinalden bağımsız olarak, orijinalle aynı düzene sahip bir setin kopyasını üretmek için kullanılabilir setin uygulaması: "

Kaynak: http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html


9

Set sadece bir arayüzdür. Düzeni korumak için, o arabirimin ve SortedSet alt arabiriminin, örneğin TreeSet veya LinkedHashSet gibi belirli bir uygulamasını kullanmanız gerekir. Setinizi şu şekilde kapatabilirsiniz:

Set myOrderedSet = new LinkedHashSet(mySet);

7

SetJava'da bulunan standart uygulamaların sipariş özelliklerinin kısa bir özeti :

  1. ekleme sırasını koru : LinkedHashSet ve CopyOnWriteArraySet (iş parçacığı için güvenli)
  2. öğeleri kümede sıralı tutun: TreeSet , EnumSet ( numaralandırmalara özel) ve ConcurrentSkipListSet (iş parçacığı için güvenli)
  3. öğeleri belirli bir sırada tutmaz: HashSet (denediğiniz)

Özel durumunuz için önce öğeleri sıralayabilir ve daha sonra 1 veya 2'den (büyük olasılıkla LinkedHashSetveya TreeSet) birini kullanabilirsiniz. Ya da alternatif olarak ve daha verimli bir şekilde , TreeSetsıralamayı sizin için otomatik olarak halledecek sıralanmamış verileri ekleyebilirsiniz .


7

Siparişi korumak için Listveya a LinkedHashSet.


1
O var LinkedHashSet, değil ... Map.
Marko Topolnik

Ben bir liste değil bir Set ihtiyacım, AYRICA sanırım nesnelerin enjeksiyon sırasını koruyan bir Set gerekir
White_King

5

LinkedHashSet, HashSet'in sıralı bir sürümüdür ve tüm öğeler arasında çift bağlantılı bir Liste sağlar. Yineleme sırasını önemsediğinizde HashSet yerine bu sınıfı kullanın.


3

Javadoc'tan Set.iterator():

Bu kümedeki öğelerin üzerinde bir yineleyici döndürür. Öğeler belirli bir sırayla döndürülmez (bu küme bir garanti sağlayan bir sınıfın örneği değilse).

Ve, shuuchan tarafından daha önce belirtildiği gibi , a TreeSet, Setgarantili bir emri olan bir uygulamasıdır :

Elemanlar, doğal düzenleri kullanılarak veya hangi kurucunun kullanıldığına bağlı olarak ayarlanan oluşturma zamanında sağlanan bir Karşılaştırıcı tarafından sipariş edilir.


3

Normalde set, bir emelent'i hızlı bir şekilde bulmak için HashSet gibi siparişi tutmaz, ancak LinkedHashSet'i deneyebilir ve koyduğunuz siparişi koruyabilirsiniz.


1

2 farklı şey var.

  1. Bir kümedeki öğeleri sıralar. Bunun için SortedSet ve benzeri uygulamalar yaptık.
  2. Kampanya siparişini bir kümede koruyun. Hangi LinkedHashSet ve CopyOnWriteArraySet (iş parçacığı için güvenli) kullanılabilir.



-2

Sadece SortedSetsiparişini yapabilirSet


Soru, (sıralanacak olan) kampanya siparişini korumakla ilgilidir.
assylias
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.