#java #sorting
Вопрос:
Меня попросили отсортировать массив автомобилей по типу модели, а затем использовать Arrays.BinarySearch для поиска автомобиля с этим полем модели. Проблема в том, что при проведении поиска он ничего не находит (даже если модель находится там).
Ниже приведен мой код и выходные данные:
import java.util.Arrays; import java.util.Comparator; import java.util.Scanner; public class CarApplication { public static void main (String[] args) { Scanner keyboard = new Scanner(System.in); Car car1 = new Car("Toyota", "Corolla" , 1996); Car car2 = new Car("Nissan", "Murano" , 2004); Car car3 = new Car("Mazda" , "Miata", 1999); Car car4 = new Car("Ford", "Mustang" , 2013); Car car5 = new Car("Chevy", "Volt" , 2020); Car car6 = new Car("Tesla", "Model X" , 2016); Car [] myCars = {car1, car2, car3, car4, car5, car6}; Arrays.sort(myCars, new CompareByModel()); System.out.println("Sorting by Model only (Comparator)"); for (Car car:myCars) System.out.println(car); System.out.println("Enter the name of the car model you wish to purchase: "); String model = keyboard.nextLine(); //binary search Car key = new Car("", model, 0); // set the name field so we can look for a match in array int location = Arrays.binarySearch(myCars, 0, myCars.length, key, new CompareByModel()); //print message if (location lt; 0) System.out.println("Sorry, please check back next week."); else { System.out.println("We have a " model " in location" myCars[location]); } } } //Comparator class CompareByModel implements Comparatorlt;Cargt; { public int compare(Car c1, Car c2) { int makeResult = c1.getCarMake().compareTo(c2.getCarMake()); int modelResult = c1.getCarModel().compareTo(c2.getCarModel()); return (modelResult == 0) ? makeResult: modelResult; } }
Выход: Введите название модели автомобиля, которую вы хотите приобрести:
Volt
Извините, пожалуйста, зайдите на следующей неделе.
Комментарии:
1. Для того , чтобы использовать вас
CompareByModel
в качествеComparator
tobinarySearch
, вам также нужно будет включитьmake
номер автомобиля вkey
. В противном случае вам нужно создатьComparator
файл, который будет игнорироватьmake
и смотретьmodel
только на него. В вашем примере я получаю результат-6
, который , с учетом примененного смещения, делает его-5
, при преобразовании в положительное число , делает его5
, который на самом деле является желаемым элементом
Ответ №1:
Когда вы сортируете, вы сортируете по make
и model
, что круто. Но когда вы пытаетесь выполнить поиск, вы устанавливаете make
""
значение «равно», поэтому результат сравнения сущностей будет работать неправильно.
Вы можете изменить сортировку Comparator
таким образом , чтобы игнорировать makes
""
ее при сравнении (только при использовании models
), или указать make
ее как часть вашего поиска, или создать отдельный «поиск» Comparator
, например
public class Main { public static void main(String[] args) { new Main(); } public Main() { Scanner keyboard = new Scanner(System.in); Car car1 = new Car("Toyota", "Corolla", 1996); Car car2 = new Car("Nissan", "Murano", 2004); Car car3 = new Car("Mazda", "Miata", 1999); Car car4 = new Car("Ford", "Mustang", 2013); Car car5 = new Car("Chevy", "Volt", 2020); Car car6 = new Car("Tesla", "Model X", 2016); Car[] myCars = {car1, car2, car3, car4, car5, car6}; Arrays.sort(myCars, new SortComparator()); System.out.println(Arrays.toString(myCars)); String model = "Murano"; int result = Arrays.binarySearch(myCars, 0, myCars.length, new Car("", model, 0), new ModelComparator()); System.out.println(result); int location = Arrays.binarySearch(myCars, 0, myCars.length, new Car("", model, 0), new SortComparator()); System.out.println(location); } public class Car { private String make; private String model; private int year; public Car(String make, String model, int year) { this.make = make; this.model = model; this.year = year; } public String getMake() { return make; } public String getModel() { return model; } public int getYear() { return year; } @Override public String toString() { return getMake() " " getModel() " @ " getYear(); } } public static class SortComparator implements Comparatorlt;Cargt; { public int compare(Car c1, Car c2) { int makeResult = c1.getMake().compareTo(c2.getMake()); int modelResult = c1.getModel().compareTo(c2.getModel()); return (modelResult == 0) ? makeResult : modelResult; } } public static class ModelComparator implements Comparatorlt;Cargt; { public int compare(Car c1, Car c2) { return c1.getModel().compareTo(c2.getModel()); } } }