That solution looks pretty clean and natural. Perhaps (now that I am awake) it would be better to have the description and test of when you are in the bucket factored out of the class and into the call. That puts the bucketing behaviour under the caller's control, allowing you to generalize the concept. (For instance one bucket might be even integers, and the next odd ones.)

If you have a lot of buckets and a lot of numbers, though, it won't scale very well. It is O(n*m). In that case you probably want to go to an array implementation and use a binary search. Which again can be hidden in a class if you wish...

Cheers,
Ben