Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在排序数组中查找属性介于范围之间的项?_Java_Sorting_Search - Fatal编程技术网

Java 在排序数组中查找属性介于范围之间的项?

Java 在排序数组中查找属性介于范围之间的项?,java,sorting,search,Java,Sorting,Search,我有一个基于年龄字段按升序排序的Obj类数组。我需要在O(log(N))时间内找到数组中具有给定最小和最大年龄的Obj项的数量 我认为我不能使用binarySearch,因为只有当姓名和年龄相同时,.equals才是真的 这就是我到目前为止所做的,但我不确定复杂性是什么 public class Obj { private String name; private int age; private Obj(String name, int age) {

我有一个基于年龄字段按升序排序的Obj类数组。我需要在O(log(N))时间内找到数组中具有给定最小和最大年龄的Obj项的数量

我认为我不能使用binarySearch,因为只有当姓名和年龄相同时,.equals才是真的

这就是我到目前为止所做的,但我不确定复杂性是什么

public class Obj {
    private String name;
    private int age;

    private Obj(String name, int age) {
        if (name == null) {
             throw new IllegalArgumentException();
        }
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public boolean equals(Object o) {
        if (!(o instanceof Obj)) {
            return false;
        }

        Obj other = (Obj) o;
        return name.equals(other.getName()) && age == other.getAge();
    }

    public static Obj[] loadFromFile(File f) {
        // Loads from file and returns an array of Obj
    }
}

public static int getObjCountInRange(Obj[] a, int minAge, int maxAge) {
    if(a == null || (minAge < 0 || maxAge < 0) || (minAge > maxAge)) {
        throw new IllegalArgumentException();
    }

    int start = 0;
    for(int i = 0; i < a.length; i++) {
        if(a[i].getAge() >= minAge) {
            start = i;
            break;
        }
    }

    int end = 0;
    for(int i = a.length -1; i > 0; i--) {
        if(a[i].getAge() <= maxAge) {
            end = i;
            break;
        }
    }

    return (end - start) + 1;
}
公共类Obj{
私有字符串名称;
私人互联网;
私有对象(字符串名称,整数){
if(name==null){
抛出新的IllegalArgumentException();
}
this.name=名称;
这个。年龄=年龄;
}
公共字符串getName(){
返回名称;
}
公共整数getAge(){
回归年龄;
}
公共布尔等于(对象o){
如果(!(o Obj实例)){
返回false;
}
Obj其他=(Obj)o;
返回name.equals(other.getName())和&age==other.getAge();
}
公共静态对象[]loadFromFile(文件f){
//从文件加载并返回Obj数组
}
}
公共静态int getObjCountInRange(Obj[]a,int minAge,int maxAge){
如果(a==null | | | | | maxAge<0)| |(minAge>maxAge)){
抛出新的IllegalArgumentException();
}
int start=0;
for(int i=0;i=minAge){
开始=i;
打破
}
}
int end=0;
对于(int i=a.length-1;i>0;i--){

if(a[i].getAge()编写一个比较器,并使用比较器对数组进行排序

然后使用第二个二进制搜索签名,该签名将比较器与新的比较器结合使用,以查找上界和下界

如果没有得到精确的匹配,则会得到一个负数,这表示如果找到值,将其反转,然后得到满足边界条件的值的开始/结束位置。

这个问题与我给出的O(logn)实现相同


这个想法是通过对下限和上限进行范围二进制搜索。例如,所有值都在谈论年龄值。

那么问题出在哪里?@Aashray我认为OP需要帮助编写一个算法,在排序数组中,在O(Log n)中查找两点之间的值时间复杂性。没有什么可以阻止您查看Collections.binarySearch后面的代码,复制它并修改它以按字段进行比较……您真正需要的是使用minAge(O(log(N))查找值,使用maxAge(O(log(N))再次查找值)然后它们之间的值的子集就是你的结果威尔,我特别需要O(logn),但我不确定我的解决方案的复杂度。@Jack 0你当前的代码从一开始就扫描所有数组元素以获得第一个匹配,然后从结尾开始扫描所有元素以获得最后一个匹配-这就是O(n)因为在最坏的情况下,你会扫描整个集合。二进制搜索会跳到每个范围的中间,然后决定从哪里开始。我不确定它是否已经按照我们用来识别边界条件的字段进行了排序。如果它已经按照该字段进行了排序,则不排序,这将是多余的。