如何获取Java树集中最接近的前k个元素?
假设我有这个如何获取Java树集中最接近的前k个元素?,java,treeset,Java,Treeset,假设我有这个树集: 我想要顶部的k个元素与输入的数字x个元素最接近 例如,使用k=3和x=5我想得到: 463 有什么方法可以做到这一点吗?似乎您需要做的是,对于所有小于目标元素的元素,获得a,对于较大的元素,获得a。现在,算法将有点类似于合并排序的合并阶段 在耳机上取一个耳罩,在机尾上取一个耳罩。称之为c\u desc,和c\u asc 检查两个元素中哪一个更接近目标值x。取此值并推进迭代器 注意其中一个迭代器何时位于相应集合视图的末尾 继续执行此操作,直到您获取了k元素 似乎您需要做的是,
树集
:
我想要顶部的k个元素与输入的数字x个元素最接近
例如,使用k=3
和x=5
我想得到:
463
有什么方法可以做到这一点吗?似乎您需要做的是,对于所有小于目标元素的元素,获得a,对于较大的元素,获得a。现在,算法将有点类似于合并排序的合并阶段
- 在耳机上取一个耳罩,在机尾上取一个耳罩。称之为
,和c\u desc
c\u asc
- 检查两个元素中哪一个更接近目标值
。取此值并推进迭代器x
- 注意其中一个迭代器何时位于相应集合视图的末尾
- 继续执行此操作,直到您获取了
元素k
- 在耳机上取一个耳罩,在机尾上取一个耳罩。称之为
,和c\u desc
c\u asc
- 检查两个元素中哪一个更接近目标值
。取此值并推进迭代器x
- 注意其中一个迭代器何时位于相应集合视图的末尾
- 继续执行此操作,直到您获取了
元素k
abs(n-x)
的最低值
也就是说,对于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
如果是这样,我会:
- 将每个
映射到整数
对
因此一个值是n->新对(n,abs(n-x))
,另一个值是它与n
x的距离李>
- (编写您自己的
,(ab)使用对
,(ab)使用映射。条目
或在库中查找)整数[2]
- (编写您自己的
- 使用使用距离的比较器对
对的列表进行排序
- 从排序列表中选取第一个
元素k
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());
“最接近x”我假设你指的是abs(n-x)
的最低值
也就是说,对于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
如果是这样,我会:
- 将每个
映射到整数
对
因此一个值是n->新对(n,abs(n-x))
,另一个值是它与n
x的距离李>
- (编写您自己的
,(ab)使用对
,(ab)使用映射。条目
或在库中查找)整数[2]
- (编写您自己的
- 使用使用距离的比较器对
对的列表进行排序
- 从排序列表中选取第一个
元素k
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());
“有没有办法做到这一点?”是的。写一个这样做的方法。如果您的意思是“TreeSet中是否有一种方法可以实现此功能?”,答案是否定的。此外,如果您计划自己实现此功能(您可能必须这样做),则需要定义某些情况。如果
k
大于集合的大小,会发生什么情况?如果x
不在集合中,会发生什么情况?如果两个元素的距离最近,会发生什么情况?“有没有办法做到这一点?”是的。写一个这样做的方法。如果您的意思是“TreeSet中是否有一种方法可以实现此功能?”,答案是否定的。此外,如果您计划自己实现此功能(您可能必须这样做),则需要定义某些情况。如果k
大于集合的大小,会发生什么情况?如果x
不在集合中,会发生什么情况?如果两个元素并列为最接近的,会发生什么?我没有为OP做任何工作,只是指向适当的函数。通过研究我所指的相关文档,将其转化为实际实现仍然需要OP来完成。@lucasvw Giving pointers完全被接受。见鬼,你甚至在对这个问题的第二次评论中给出了一些!“照我说的做,而不是照我做的做”?这似乎是一个家庭作业问题的合理细节。请参阅:“您可以先使用伪代码…”。那又怎样?行为得当,在问题上打上标记,不要责骂回答者。@OlivierGrégoire我不相信我责骂过任何人,但如果我责骂过,我会很高兴道歉。我只是表达了我的观点。我没有为OP做任何工作,只是指出了适当的功能。通过研究我所指的相关文档,将其转化为实际实现仍然需要OP来完成。@lucasvw Giving pointers完全被接受。见鬼,你甚至在对这个问题的第二次评论中给出了一些!“照我说的做,而不是照我做的做”?这似乎是一个家庭作业问题的合理细节。请参阅:“您可以先使用伪代码…”。那又怎样?行为得当,在问题上打上标记,不要责骂回答者。@OlivierGrégoire我不相信我责骂过任何人,但如果我责骂过,我会很高兴道歉。我只是表达了我的意见