假设,我有一个未排序的范围数组。
例如
class CreditRange{
long credits;
int id;
}
现在我要查找,给定的信用计数值属于CreditRange 中的哪一个。
可能的
Set<CreditRange>
值可以是CreditRange :{id:1,credits:0}
CreditRange :{id:2,credits:100}
CreditRange :{id:3,credits:500}
CreditRange :{id:4,credits:250}
CreditRange :{id:1,credits:0}
CreditRange :{id:4,credits:250}
CreditRange :{id:3,credits:500}
我们可以假设 range 数组占用 ~1M 并适合内存。我正在寻找一种简单的算法,它只使用标准的 JDK 集合,没有任何 3d 方库和特殊的数据结构,但运行速度相当快。
你有什么建议?
最佳答案
我想,这不是你所说的范围。相反,您想要小于传递的元素的最大元素。
您可以按照以下步骤解决问题:
Comparator
,它根据学分进行比较 TreeSet
,将该比较器的实例传递给它的构造函数。它将根据比较器对其中的项目进行排序。 TreeSet#floor(E)
方法获取小于 E
的最大元素,根据比较器。当然,你必须创建一个 CreditRange
对象来搜索。您不能只搜索 300
。 演示代码:
NavigableSet<Integer> set = new TreeSet<>();
set.add(0); set.add(100);
set.add(250); set.add(500);
System.out.println(set.floor(50)); // 0
System.out.println(set.floor(300)); // 250
并请重命名您的类(class)。它没有以任何方式描绘范围。正如 Jon Skeet 在评论中指定的那样,它也许应该更好地命名为
CreditBound
。关于java - 在 Java 中查找值所在的范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19064766/