2014-04-04 18 views
5

Kịch bản:Java - Triển khai Danh sách tròn tròn, và đếm số lần truy cập của phần tử?


Đối với một danh sách đó có 3 yếu tố [A, B, C]:

Bạn có thể truy cập tròn nó nhiều lần như bạn muốn. Và có một chức năng đếm bổ sung ghi lại số lượng truy cập của từng phần tử.

Ví dụ, nếu truy cập vào nó 7 lần, nên quay lại:

 

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

Và có đếm truy cập của mỗi yếu tố như sau:

 

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

Bất kỳ phản ứng sẽ được đánh giá rất nhiều.

Trân trọng.


Cập nhật


Thêm một chức năng bổ sung cho phép người gọi để xác định một danh sách các yếu tố nên được lọc. Vẫn sử dụng 7 lần truy cập như một ví dụ, lọc [C]:

 

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

 

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

, sự kêu gọi tiếp theo trên getNextOne() nên luôn luôn lấy một trong đó truy cập count thấp (Mô phỏng một tải- thực hiện đếm số lượt truy cập cân bằng.). Vì vậy, nếu cố gắng gọi thứ hai để truy cập nó 10 lần, nên quay lại:

 

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

 

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

Trả lời

18

Ổi cung cấp một Iterables.cycle(), cùng với một Multiset for counting và bạn đã hoàn tất:

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

Output:

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

NB: Cẩn thận để có đúng equals/hashCode cho loại T

+0

Việc triển khai này rất thanh lịch. Cảm ơn bạn rất nhiều vì đã trả lời nhanh chóng! – Wuaner

+0

Tôi đã cập nhật câu hỏi của mình. – Wuaner

+0

@Wuaner vui lòng tạo câu hỏi mới, đừng cập nhật sau hơn 1 năm, cảm ơn. –

Các vấn đề liên quan