2011-08-16 14 views
45

Basit bir koleksiyon sorularım var. Set<String> nesnesine sahibim. Bu sette dizelerin numaralandırılmasını istiyorum. Bu konuda gitmek için en temiz/en iyi yolu nedir?Java: Set sayımı <String>

+1

java.util'deki numaralandırma Not:? Bunun yerine java.util.Iterable kullanmak için herhangi bir sebep? –

+2

evet .. Çünkü özellikle bir Numaralandırma döndüren bir yöntemi geçersiz kılıyorum. – Charlotte

+1

Bunun yerine en çok oylanan cevabı kabul etmelisiniz. –

cevap

26

DÜZENLEME: Kendiniz yazmanıza gerek yoktur (her ne kadar bu uygulamayı posteritlik için terk edersem de) - Kevin Bourrillion'un JDK'daki yanıtını görün. Eğer gerçekten bir numaralandırma ihtiyaç olursa


, kullanabilirsiniz olabilir:

Enumeration<String> x = new Vector(set).elements(); 

Hiç mümkünse Iterable<E> kullanmak daha iyi olurdu ama ...

Daha iyi bir alternatiftir Iterator<E> etrafında küçük bir sarıcı sınıf yazmak. Eğer herhangi bir for döngüsü, geçerli aracılığıyla matematiksel anlamda en temiz Bunu yapmanın bir yolu olan numaralandırma demek varsayarsak

import java.util.*; 

class IteratorEnumeration<E> implements Enumeration<E> 
{ 
    private final Iterator<E> iterator; 

    public IteratorEnumeration(Iterator<E> iterator) 
    { 
     this.iterator = iterator; 
    } 

    public E nextElement() { 
     return iterator.next(); 
    } 

    public boolean hasMoreElements() { 
     return iterator.hasNext(); 
    } 

} 


public class Test { 
    public static void main(String[] args) { 
     Set<String> set = new HashSet<String>(); 
     Enumeration<String> x = new IteratorEnumeration<String>(set.iterator()); 
    } 
} 
+0

@Downvoter: Yorum yapmak ister misiniz? –

+0

Az önce oy kullandım. JDK, Kevin Bourrillion tarafından işaret edildiği gibi sizin için yaptığınız bir statik kullanım yöntemine sahip olduğunda kendi uygulamanızı yazmaya gerek yoktur. – Snekse

+1

@Snekse: Önceki downvoter çok şey söylemiş olsaydı, bu yararlı olurdu. Cevabımı kabul edilen kişi olarak şimdi silemiyorum, ama Kevin'ın dikkatini çekebilirim ... –

5

: Eğer yok Bu şekilde sadece Enumeration<E> bir Yapılanma Modeli bulmak için bir kopyasını almak Iterable uygulayan sınıfı: Eğer gerçekten bir Enumeration gerektiriyorsa

Set<String> strs = ... 

for (String s : strs) { 
... 
} 

Eğer iterator() arayarak iade Iterator sarmak için bir adaptör sınıf uygulamak olabilir. Apache Koleksiyonları kitaplığında bir adaptör sınıfı var: IteratorEnumeration.

Yoksa Google'ın Guava kitaplığını kullanabilirsiniz:

Set<String> mySet = ... 
Enumeration<String> = Iterators.asEnumeration(mySet.iterator()); 
+1

Downvoter ...Yorumlara dikkat etmek ister misiniz? – Adamski

170

java.util.Collections.enumeration(set)

Javadoc

belirtilen koleksiyonu üzerinde bir numaralandırma döndürür. Bu, girişi olarak bir numaralandırma gerektiren eski API'lerle birlikte çalışabilirlik sağlar.

+8

Tamam, cevabımın ters olduğunu anlıyorum, ama bunun nedeni, gerçekten söylenmesi gereken şey. :) Bu yöntem JDK'dadır ve tam olarak * posterin ne istediğini * yapar. En son sıraya girmesi garip. –

+1

Etkin Java Öğesi 47: Kütüphaneleri bilir ve kullanır – Ray