2012-07-10 17 views
7

Ben bir MR işi yazma aşamasındayım. Ama yinelenen bir nesneye ilişkin bir Sorun ile sıkışıp kaldım. Onun boyutunu bulmalıyım. Bunu bir List nesnesine gönderdim, ancak bu yanlıştı (Liste yinelenebilir, ancak tersine çevirilemez.) Başka bir yol vardır, yani nesne için bir yineleyici kullanarak ve her değer için bir sayaç artırarak. Ancak bu optimal bir çözüm değildir. Herkes daha iyi bir yol önerebilir mi?Yinelenen Nesnenin boyutu nasıl bulunur?

Lütfen bana yardım edin. Şimdiden teşekkürler.

+0

Lütfen kontrol edebilmek için kodunuzu buraya yazınız. –

+0

Bu soru gerçekten düzenlemek bağlantılı bir konumun kopyası gibi gelmiyor – shieldgenerator7

cevap

15

Collection arabirimi, size() yöntemini sağlar ve Iterable uzatır. Eğer yineleyiciniz bir koleksiyondan geliyorsa, onun boyutunu isteyebilirsiniz, aksi takdirde şansınız kalmaz, sadece sonuna kadar yinelemeniz gerekir.

public int size(Iterable<?> it) { 
    if (it instanceof Collection) 
    return ((Collection<?>)it).size(); 

    // else iterate 

    int i = 0; 
    for (Object obj : it) i++; 
    return i; 
} 
0

Yineleyici üzerinde() bir büyüklüğe sahip değildir, ancak Iterator türetilmiş ve aktarılmış Koleksiyonu bazı java gibi bir büyüklüğe() vardır:

İşte bu uygulayan bir beygir. util.LinkedList.size(). Yani, bazı durumlarda yinelemek zorunda kalabilirsiniz.

+0

sorun redüktör fonksiyonu ile geçerli: korumalı nihai boşluk azaltmak (nihai Metin tuşuna \t \t \t \t nihai iterable değerleri nihai Bağlam Bağlam \t \t \t \t, IOException, InterruptedException { } } } "değerleri" burada yinelenebilir bir nesnedir. Iterating olmadan boyutunu bulmaya ihtiyacım var.Ama bu bir toplama nesnesi olmadığı için mümkün değil.Bir boyutu bulduktan sonra başka bir işlem yapmak gerekir. Bu nesne üzerinde yineliyorsam, yinelemeden sonra yineleyici son değerine işaret eder. Onu sıfırlaman gerek. Bu yüzden bir ResettableIterator kullanıyorum, böylece iterasyondan sonra sıfırlayabilirim. –

+0

Bir "Yinelenen" den istediğiniz kadar çok bir "yineleyici"() istemeniz gerekir, bu yüzden "küçült" ve "küçült" de "yineleyici" almazsınız. Bu nedenle, yineleyici a = values.iterator(), b = values.iterator(); 'mükemmel bir şekilde geçerlidir ve her ikisinde de' remove() 'olarak adlandırılmadığınız sürece bağımsız olmalıdırlar. – TWiStErRob

5

Yineleyiciyi gözden geçirip öğeleri saymanız gerekir. Örneğin ,

  while (iterator.hasNext()) { 
      iterator.next(); 
      count++; 
     } 

Bu çok temiz değil ama yineleyici yineleme amacıyla kullanılır ve bunun için herhangi bir spesifik api sağlamaz.

Ancak, yineleyici nerede oluşturulur? Başka bir nesneden, örneğin bir Koleksiyon nesnesinden geliyorsa, kaynağın boyutunu belirleyebilir ve yineleyicinin kendisini belirleyemezsiniz.

+0

Bu, yinelenebilir durumda çalışmayacaktır. – Siddarth