impl top K items
This commit is contained in:
parent
66857c1fbc
commit
ab9f58704c
@ -0,0 +1,30 @@
|
||||
package ch29_heap_solutions
|
||||
|
||||
import scala.collection.mutable
|
||||
|
||||
/**
|
||||
* keep the top k items in the the class
|
||||
*/
|
||||
class TopKItemsKeeper(val itemsToKeepCount: Int) {
|
||||
|
||||
|
||||
//have a smallest value top heap
|
||||
val queue = new mutable.PriorityQueue[Int]()(scala.math.Ordering.Int.reverse)
|
||||
|
||||
def put(item: Int): Unit = {
|
||||
if (queue.length < itemsToKeepCount) {
|
||||
queue += item
|
||||
return
|
||||
}
|
||||
|
||||
//queue already have the k items
|
||||
if (item.compareTo(queue.head) > 0) {
|
||||
queue.dequeue()
|
||||
queue += item
|
||||
}
|
||||
}
|
||||
|
||||
def get(): List[Int] = {
|
||||
queue.clone().dequeueAll
|
||||
}
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
package ch29_heap_solutions
|
||||
|
||||
import org.scalatest.{FlatSpec, Matchers}
|
||||
|
||||
import scala.util.Random
|
||||
|
||||
class TopKItemsKeeperTest extends FlatSpec with Matchers {
|
||||
|
||||
behavior of "TopKItemsKeeperTest"
|
||||
|
||||
it should "put and get top K from the keeper" in {
|
||||
val length = 50
|
||||
val k = 5
|
||||
val topKItemsKeeper = new TopKItemsKeeper(k)
|
||||
val nums = new Array[Int](length)
|
||||
for (i <- Range(0, length)) {
|
||||
nums(i) = Random.nextInt
|
||||
}
|
||||
|
||||
nums.foreach(topKItemsKeeper.put)
|
||||
val ordering = scala.math.Ordering.Int.reverse
|
||||
topKItemsKeeper.get().toArray.sorted(ordering) should equal(nums.sorted(ordering).slice(0, k))
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user