2014-04-04 22 views
5

Szenario:Java - Implementierung einer Round-Robin-Ringliste und Zählung der Zugriffszahl eines Elements?


Eine Liste, die drei Elemente [A, B, C] haben:

Sie können Kreis Zugriff es so oft wie Sie wollen. Und es gibt eine zusätzliche Zählfunktion, die Zugriffszahlen jedes Elements aufzeichnet.

Zum Beispiel, wenn es 7 Mal zugreifen, sollte zurück:

 

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

Und haben Zugriffszählregister jedes Element, wie folgend:

 

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

Jede Antwort wäre sehr dankbar.

Grüße. In


eine weitere zusätzliche Funktion, die Anrufer erlauben, eine Liste Elemente angeben, die gefiltert werden sollen


aktualisiert. Noch 7 mal als Beispiel den Zugriff verwenden, Filtern [C]:

 

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

 

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

Und sollte die anschließende Berufung auf getNextOne() immer den einen holen, die Zählung niedrig Zugriff ist (Simulieren Sie einen last- Balanced Accessing Count Implementierung.). Also, wenn zweiter Anrufer versucht es 10-mal auf den Zugriff, sollte zurück:

 

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

 

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

Antwort

18

Guava bietet eine Iterables.cycle(), verbunden mit einem Multiset for counting und fertig:

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

Ausgang:

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

Hinweis: Achten Sie darauf, equals/hashCode für Typ T

+0

Diese Implementierung ist so elegant. Vielen Dank für Ihre schnelle Antwort! – Wuaner

+0

Ich habe meine Frage aktualisiert. – Wuaner

+0

@Wuaner bitte erstellen Sie eine neue Frage, aktualisieren Sie nicht mehr als 1 Jahr nach, danke. –