Сортировка и двоичный поиск (Java)

#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 to binarySearch , вам также нужно будет включить 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());  }   } }