假设,我有一个未排序的范围数组。
例如

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 方库和特殊的数据结构,但运行速度相当快。

你有什么建议?

最佳答案

我想,这不是你所说的范围。相反,您想要小于传递的元素的最大元素。

您可以按照以下步骤解决问题:

  • 首先为你的类(class)实现一个 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/

    10-14 05:39