2014-04-04 18 views
5

Senaryo:Java - Dairesel bir yuvarlak liste ve sayım öğesinin erişim sayısının uygulanması?

Sen dairesel erişim kadar birçok kez istediğiniz gibi: 3 elementler [A, B, C] sahip listesi için


. Ayrıca, her bir öğenin erişim sayımı ek sayım işlevi vardır. Aşağıdaki her bir elemanın erişim sayısı

 

    [A, B, C, A, B, C, A] 

ve vardır: 7 kere erişmek halinde

Örneğin, döndürmelidir

 

    +–––––––––––+–––––––––––––––+ 
    | Element | Access count | 
    +–––––––––––––––––––––––––––+ 
    |  A  |  3  | 
    +–––––––––––––––––––––––––––+ 
    |  B  |  2  | 
    +–––––––––––––––––––––––––––+ 
    |  C  |  2  | 
    +–––––––––––+–––––––––––––––+ 

Herhangi bir yanıt büyük takdir.

Saygılarımızla.



Arayan filtrelenmesi gereken bir element listesini belirtmek için izin başka ek fonksiyon ekleme güncellendi. Yine 7 kez [C], filtreden bir örnek olarak erişmek kullanımı:

 

    [A, B, A, B, A, B, A] 

 

    +–––––––––––+–––––––––––––––+ 
    | Element | Access count | 
    +–––––––––––––––––––––––––––+ 
    |  A  |  4  | 
    +–––––––––––––––––––––––––––+ 
    |  B  |  3  | 
    +–––––––––––––––––––––––––––+ 
    |  C  |  0  | 
    +–––––––––––+–––––––––––––––+ 

ve, getNextOne üzerinde sonraki çağrı() her zaman sayımı düşük olur erişmek bir almak gerekir: (a yüke simüle dengeli erişim sayısı uygulaması. Yani, o 10 kez erişen ikinci arayan girişimi dönmelidir eğer:

 

    [C, C, C, B, C, A, B, C, A, B, C, A] 

 

    +–––––––––––+–––––––––––––––+ 
    | Element | Access count | 
    +–––––––––––––––––––––––––––+ 
    |  A  |  7  | 
    +–––––––––––––––––––––––––––+ 
    |  B  |  6  | 
    +–––––––––––––––––––––––––––+ 
    |  C  |  6  | 
    +–––––––––––+–––––––––––––––+ 

cevap

18

Guava bir Multiset for counting ile birleştiğinde bir Iterables.cycle() sağlar ve bitirdiniz:

package com.stackoverflow.so22869350; 

import com.google.common.collect.HashMultiset; 
import com.google.common.collect.Iterables; 
import com.google.common.collect.Lists; 
import com.google.common.collect.Multiset; 

import java.util.Iterator; 
import java.util.List; 

public class Circular<T> { 

    private final Multiset<T> counter; 

    private final Iterator<T> elements; 

    public Circular(final List<T> elements) { 
     this.counter = HashMultiset.create(); 
     this.elements = Iterables.cycle(elements).iterator(); 
    } 

    public T getOne() { 
     final T element = this.elements.next(); 
     this.counter.add(element); 
     return element; 
    } 

    public int getCount(final T element) { 
     return this.counter.count(element); 
    } 

    public static void main(final String[] args) { 
     final Circular<String> circular = new Circular<>(Lists.newArrayList("A", "B", "C")); 
     for (int i = 0; i < 7; i++) { 
      System.out.println(circular.getOne()); 
     } 
     System.out.println("Count for A: " + circular.getCount("A")); 
    } 
} 

Çıktı:

A 
B 
C 
A 
B 
C 
A 
Count for A: 3 

NB:T

+0

için uygun equals/hashCode numaralı ürüne dikkat edin Bu uygulama çok şık. Hızlı yanıtınız için çok teşekkür ederim! – Wuaner

+0

Sorumu güncelledim. – Wuaner

+0

@Wuaner Lütfen yeni bir soru oluşturun, 1 yıldan sonra güncellemeyin, teşekkürler. –