package com.haogrgr.test.topn;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;
import java.util.Random;
public class TopNHeapContainer<T> implements Iterable<T> {
private int maxLen;
private List<T> tops;
private Comparator<T> comparator;
public TopNHeapContainer(int maxLen, Comparator<T> comparator) {
this.maxLen = maxLen;
this.tops = new ArrayList<T>(maxLen + 1);
this.comparator = comparator;
}
public void add(T e) {
if (tops.size() >= maxLen) {
if (comparator.compare(e, tops.get(0)) > 0) {
int index = 0;
while (index < tops.size() - 1 && comparator.compare(e, tops.get(index + 1)) > 0) {
index++;
}
if (index == 0) {
tops.set(0, e);
} else {
tops.remove(0);
tops.add(index, e);
}
}
return;
}
if (tops.size() < maxLen - 1) {
tops.add(e);
return;
}
if (tops.size() == maxLen - 1) {
tops.add(e);
Collections.sort(tops, comparator);
return;
}
}
@Override
public Iterator<T> iterator() {
return tops.iterator();
}
@Override
public String toString() {
return tops.toString();
}
public static TopNHeapContainer<Entry<String, Integer>> getTopNContainer(int topSize){
TopNHeapContainer<Entry<String, Integer>> tops = new TopNHeapContainer<Entry<String,Integer>>(topSize, new Comparator<Entry<String, Integer>>() {
@Override
public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
return o1.getValue() - o2.getValue();
}
});
return tops;
}
public static void main(String[] args) {
TopNHeapContainer<Integer> tops = new TopNHeapContainer<Integer>(10, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
});
ArrayList<Integer> list = new ArrayList<Integer>();
Random random = new Random();
for (int i = 0; i < 20; i++) {
int nextInt = random.nextInt(10);
tops.add(nextInt);
list.add(nextInt);
}
System.out.println(tops);
Collections.sort(list);
System.out.println(list);
}
}