2014-04-04 29 views
5

場景:Java - 實現一個循環循環列表,並計算元素的訪問計數?


對於有3個要素[A,B,C]名單:

可以圓形訪問它很多次,只要你想。 並且有一個額外的計數功能記錄每個元素的訪問計數。

例如,如果訪問它的7倍,應該返回:

 

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

並具有各元素的訪問次數如下:

 

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

任何響應,將不勝感激。

問候。


更新


添加其他附加功能,使主叫方指定應待過濾的元素列表。仍然使用7次訪問作爲例如,過濾[C]:

 

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

 

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

而且,上getNextOne後續呼叫()應始終取訪問計數是低的一個(模擬一個負載平衡訪問次數的實現)。所以,如果第二個呼叫方試圖訪問10次,應該返回:

 

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

 

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

回答

18

番石榴提供Iterables.cycle(),再加上Multiset for counting,就大功告成了:

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

輸出:

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

注意:請注意有適當的equals/hashCode對於類型T

+0

此實現是如此優雅。非常感謝您的及時響應! – Wuaner

+0

我已更新我的問題。 – Wuaner

+0

@Wuaner請創建一個新的問題,不要超過1年後更新,謝謝。 –