2010-12-09 16 views
17

Kümeler ve Liste arasındaki farkları biliyorum (benzersiz ve yinelenen çoğaltmalara izin verilmiyor, sipariş edilmiyor/sipariş verilmiyor). Aradığım şey, öğelerin emrini tutan bir settir (bu kolay), fakat bir öğenin eklendiği endeksi de kurtarabilmem gerekir. Yani eğer dört element eklerseniz, o zaman bunlardan birinin girildiği sırayı bilmek istiyorum.java.util.Set içindeki bir öğenin endeksini nasıl alabilirim

Herhangi bir anda, bir String'in önceden eklenip eklenmediğini kontrol edebilir ve dizede dizinin dizinini alabilirim. Bunun gibi bir şey var mı yoksa kendim mi uygulamalıyım?

+0

Bu arada "birini" kaldırırsanız getIndex'in ne için geri gelmesini beklerdiniz? –

+0

Eğer http://commons.apache.org/collections/ ortak koleksiyonda bulunmuyorsa, o zaman bunu kendiniz uygulamak zorunda kalacağınızı düşünüyorum. –

+0

Eh, set sipariş edilmesi gerektiğinden, eğer bir eleman tüm elemanlar çıkarılmışsa Bundan sonra bir pozisyon yeniden tahsis edildi. Var olmayan bir elementin getIndexini yaparsam ya da kaldırılmış olsaydım, -1 elde ederdim. –

cevap

11

bir Util sınıfında küçük bir statik özel yöntem yardımcı olacaktır:

public static int getIndex(Set<? extends Object> set, Object value) { 
    int result = 0; 
    for (Object entry:set) { 
    if (entry.equals(value)) return result; 
    result++; 
    } 
    return -1; 
} 

sen/birSet biri sınıf bunu istiyorum ve bir getIndex() yöntem sunar gerekiyorsa, şiddetle yeni Set uygulamaya önermek Set sadece Liste ve Listesi'nden dizine göre almak dönüştürmek oluşturduktan sonra

public class IndexAwareSet<T> implements Set { 
    private Set<T> set; 
    public IndexAwareSet(Set<T> set) { 
    this.set = set; 
    } 

    // ... implement all methods from Set and delegate to the internal Set 

    public int getIndex(T entry) { 
    int result = 0; 
    for (T entry:set) { 
     if (entry.equals(value)) return result; 
     result++; 
    } 
    return -1; 
    } 
} 
+0

Örnek için teşekkürler. Bir soru, Set boyunca yinelenen önce arama (T girişi) aramak için değer mi? –

+0

@Jose - Set'e bağlıdır. HashSet: Evet, O (1) 'de çalışır. TreeSet - Hayır, içerdiği gibi O (n) 'getIndex' algoritması gibi. Yani iki kat daha uzun sürecek. –

+0

Bir HashSet'i dekore ederseniz, istediğiniz davranışı (yani ekleme sırasına göre dizin) alamayacağınızı unutmayın. İterasyon siparişi ekleme siparişiyle eşleşen bir Küme sağlamalısınız. LinkedHashSet bu yeteneğe sahiptir. –

3

LinkedHashSet ürününü istenilen getIndex() yöntem ekleyerek genişletebilirsiniz. Bunu uygulamak ve test etmek 15 dakika. Sadece yineleyici ve sayıcı kullanarak setten geçin, nesneyi eşitlik açısından kontrol edin. Bulunursa, sayacı iade edin.

+2

TreeSet, öğelerin eklendiği sırayı tutmayacak, doğal düzende sıralanacaktır. –

+0

@Jose, teşekkürler. cevabı düzenledi. –

12

: ve dekoratör desen kullanmak

Set<String> stringsSet = new HashSet<>(); 
stringsSet.add("string1"); 
stringsSet.add("string2"); 

List<String> stringsList = new ArrayList<>(stringsSet); 
stringsList.get(0); // "string1"; 
stringsList.get(1); // "string2"; 
+0

Sorunun bir kümedeki bir öğenin endeksini nasıl alacağına ve bir öğeyi bir dizine göre nasıl alacağımız olduğuna inanıyorum. – jbird

+2

stringsList.indexOf ("string1"); –

İlgili konular