Supposing I have this TreeSet<Integer>:
1 3 4 6 8 9 10
And I want the top-k "closest" elements to an input number x. 
For example, with k=3 and x=5 I want to get:
4 6 3
Is there any way to do this?
Supposing I have this TreeSet<Integer>:
1 3 4 6 8 9 10
And I want the top-k "closest" elements to an input number x. 
For example, with k=3 and x=5 I want to get:
4 6 3
Is there any way to do this?
It seems what you need to do is to get a headSet with all elements smaller than the target element and a tailSet for the bigger elements. Now the algorithm will be somewhat similar to merge phase of merge sort.
c_desc, and c_ascx. Take this value and advance the iteratork elementsBy "closest to x" I assume you mean the lowest values of abs(n - x).
That is, for x=5, k=3:
1,3,4,6,8,9,10   -> 3,4,6
3,4,5,10,11,12   -> 3,4,5
0,1,2,5,6,7,8    -> 5,6,7
If that's the case, I would:
Integer to a Pair<Integer,Integer>
n -> new Pair(n, abs(n - x)) so one value is n, the other is its distance from x. Pair, (ab)use Map.Entry, (ab)use Integer[2] or find one in a library)Pair<> using a comparator that uses the distancek elements from that sorted list.Using Java 8 streams:
 set.stream()
   .map( n -> new Pair(n, Math.abs(x - n)))
   .sorted(Comparator.comparing( p -> p.right())
   .limit(k)
   .map( p -> p.left())
   .collect(Collectors.toSet());