2014-04-04 12 views
5

Scenario:Java - Implementazione di una lista circolare round robin e conteggio del numero di elementi dell'elemento?


Per un elenco che hanno 3 elementi [A, B, C]:

È possibile accedere a circolare tutte le volte che vuoi. E c'è una funzione di conteggio aggiuntiva che registra il conteggio degli accessi di ciascun elemento.

Ad esempio, se accedervi 7 volte, deve restituire:

 

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

E hanno accesso conteggio di ciascun elemento come segue:

 

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

Qualsiasi risposta sarebbe molto apprezzato.

Saluti.


Aggiornato


Aggiungere un'altra funzione aggiuntiva che permette chiamante di specificare un elenco di elementi che dovrebbero essere filtrati. usano ancora 7 volte accedendo come esempio, filtrando [C]:

 

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

 

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

E, la successiva chiamata su getNextOne() deve sempre prendere quello che l'accesso conteggio è bassa (simulare un load implementazione di conteggio di accesso bilanciata.). Quindi, se secondo tentativo chiamante per l'accesso a 10 volte, deve restituire:

 

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

 

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

risposta

18

Guava fornisce un Iterables.cycle(), accoppiato con un Multiset for counting e il gioco è fatto:

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")); 
    } 
} 

uscita:

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

NB: Attenzione per avere il corretto equals/hashCode per il tipo T

+0

Questa implementazione è così elegante. Grazie mille per la tua pronta risposta! – Wuaner

+0

Ho aggiornato la mia domanda. – Wuaner

+0

@Wuaner si prega di creare una nuova domanda, non aggiornare più di 1 anno dopo, grazie. –

Problemi correlati