【问题标题】:Sorting and Binary Search (Java)排序和二分查找 (Java)
【发布时间】:2021-12-20 22:33:47
【问题描述】:

我被要求按型号类型对汽车数组进行排序,然后使用 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 < 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 Comparator<Car>
{
    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;
    }
    
}

输出: 输入您要购买的车型名称:

伏特

抱歉,请下周再来看看。

【问题讨论】:

  • 为了将CompareByModel 用作ComparatorbinarySearch,您还需要在key 中包含汽车的make。否则,您需要创建一个Comparator,它将忽略make 并仅查看model。在您的示例中,我得到了-6 的结果,考虑到应用的偏移量,使其变为-5,当转换为正数时,变为5,这实际上是所需的元素

标签: java sorting


【解决方案1】:

排序时,按makemodel 排序,这很酷。但是当您尝试搜索时,您将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 Comparator<Car> {

        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 Comparator<Car> {

        public int compare(Car c1, Car c2) {
            return c1.getModel().compareTo(c2.getModel());
        }

    }
}

【讨论】:

    猜你喜欢
    • 2017-05-11
    • 1970-01-01
    • 2013-04-23
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    相关资源
    最近更新 更多