如何在Java TreeSet中获取top-k最接近的元素?

时间:2017-06-13 14:59:18

标签: java treeset

假设我有TreeSet<Integer>

1 3 4 6 8 9 10

我希望顶部 - k“最接近”的元素与输入数字x相符。

例如,我希望得到k=3x=5

4 6 3

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:4)

您需要做的是获得一个headSet,所有元素都小于目标元素,tailSet代表更大的元素。现在算法有点类似于合并排序的合并阶段。

  • 取一个headSet的descendingIterator和尾部的iterator。拨打这些c_descc_asc
  • 检查两个元素中的哪一个更接近目标值x。取此值并推进迭代器
  • 当其中一个迭代器位于相应的设置视图的末尾时,请注意
  • 继续这样做,直到您采用k元素

答案 1 :(得分:2)

“最接近x”我假设你的意思是 let filtered = array.filter { $0 >= 5 && $0 <= 10 } 的最低值。

即,对于x = 5,k = 3:

abs(n - x)

如果是这样,我会:

  • 将每个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 映射到Integer
    • Pair<Integer,Integer>所以一个值是n -> new Pair(n, abs(n - x)),另一个值是n的距离。
    • (自己编写x,(ab)使用Pair,(ab)使用Map.Entry或在库中找到一个)
  • 使用距离
  • 的比较器对Integer[2]列表进行排序
  • 从该排序列表中获取第一个Pair<>元素。

使用Java 8流:

k