У меня есть массив класса Obj, отсортированный по возрастанию в зависимости от возраста. Мне нужно найти количество предметов Obj, возраст которых в пределах заданного минимального и максимального возраста в массиве в O (log (N)).Поиск элементов в отсортированном массиве со свойствами между диапазоном?
Я не думаю, что могу использовать 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;
}
Так в чем проблема? – Aashray
@Aashray Я считаю, что OP нуждается в помощи, написав алгоритм, который найдет значения между двумя точками в отсортированном массиве в сложной временной сложности O (Log n). – christopher
ничего не мешает вам взглянуть на код beh Collections.binarySearch, скопировать его и изменить его для сравнения по полю ... все, что вам действительно нужно, - это найти значение с помощью minAge (O (log (N)), найти значение с maxAge (O (log (N) снова), а затем подмножество значений между ними - ваш результат – radai