Java 查找操作员的最低价格列表 Country code List=92445、445、966、92445、966、966、92 价目表=0.99,0.91,0.92,0.97,0.93,0.97,0.92,0.97,1.0 操作员列表=A、C、A、B、C、B、A、C、A

Java 查找操作员的最低价格列表 Country code List=92445、445、966、92445、966、966、92 价目表=0.99,0.91,0.92,0.97,0.93,0.97,0.92,0.97,1.0 操作员列表=A、C、A、B、C、B、A、C、A,java,binary-search,comparator,Java,Binary Search,Comparator,当用户输入国家代码时,我应该找到最低价格表和相应的操作员。 可以复制国家代码数据。这不是唯一的。e、 g.因为我们不知道countrycode:92属于哪个操作符,92可以存在于countrycode列表中的操作符A、B或C中 我已经写了下面的代码。但它有一个问题 问题:我可以对CountryCode进行排序,但是下面代码中的binarySearch无法相应地计算出最低价格列表。它总是给我随机值,这不是最低价格。对以下代码的改进将不胜感激 class Dog implements Compara

当用户输入国家代码时,我应该找到最低价格表和相应的操作员。 可以复制国家代码数据。这不是唯一的。e、 g.因为我们不知道countrycode:92属于哪个操作符,92可以存在于countrycode列表中的操作符A、B或C中

我已经写了下面的代码。但它有一个问题

问题:我可以对CountryCode进行排序,但是下面代码中的binarySearch无法相应地计算出最低价格列表。它总是给我随机值,这不是最低价格。对以下代码的改进将不胜感激

class Dog implements Comparator<Dog>, Comparable<Dog>{
   private int CountryCode; 
   private double Price;
   private String Operator;
   Dog(){
   }

   Dog( int c, double p, String o){
       CountryCode= c;
       Price= p;
       Operator=o;
   }

   public int getCountryCode(){
      return CountryCode;
   }

   public double getPrice(){
      return Price;
   }
   public String getOperator(){
          return Operator;
       }


   // Overriding the compareTo method
   public int compareTo(Dog d){

       return CountryCode- d.getCountryCode();
   }


   // Overriding the compare method to sort the age 
   public int compare(Dog d, Dog d1){
       return d.CountryCode - d1.CountryCode;     
   }




}


public class Ser {                          
/**                                     
 * @param args
 */
public static void main(String[] args) {
    // Takes a list o Dog objects
    ArrayList <Dog> list1 = new ArrayList<Dog>();

      list1.add(new Dog(92, 0.99 , "A"));
      list1.add(new Dog(445, 0.91 , "C"));
      list1.add(new Dog(445, 0.92 , "A"));
      list1.add(new Dog(966, 0.97 , "B"));
      list1.add(new Dog(92, 0.93 , "C"));
      list1.add(new Dog(445, 0.97 , "B"));
      list1.add(new Dog(966, 0.92, "A"));
      list1.add(new Dog(966,0.97, "C"));
      list1.add(new Dog(92,1.0, "A"));
      // Sorts the array list using comparator

      Collections.sort(list1, new Dog());

      for(Dog a: list1)//printing the sorted list of ages
          System.out.println(a.getCountryCode() +"  : "+
         a.getOperator()+"  : "+ a.getPrice());

     int index=  Collections.binarySearch(list1, new Dog ( 92,null,null));

      if (index>=0)
      System.out.println( list1.get(index).getOperator()+ " " + list1.get(index).getPrice());
      else
          System.out.println("No operator is availible");

}}
类狗实现比较器,可比较{
私人国际编码;
私人双价;
私有字符串运算符;
狗(){
}
狗(内c,双p,字符串o){
CountryCode=c;
价格=p;
运算符=o;
}
public int getCountryCode(){
返回国家代码;
}
公开双价{
退货价格;
}
公共字符串getOperator(){
返回运算符;
}
//重写compareTo方法
公共内部比较(狗d){
返回CountryCode-d.getCountryCode();
}
//重写compare方法以对年龄进行排序
公共整数比较(狗d、狗d1){
返回d.CountryCode-d1.CountryCode;
}
}
公共类Ser{
/**                                     
*@param args
*/
公共静态void main(字符串[]args){
//获取狗对象的列表
ArrayList list1=新的ArrayList();
列表1.添加(新狗(92,0.99,“A”);
列表1.添加(新狗(445,0.91,“C”);
列表1.添加(新狗(445,0.92,“A”);
列表1.添加(新狗(966,0.97,“B”);
列表1.添加(新狗(92,0.93,“C”);
列表1.添加(新狗(445,0.97,“B”);
列表1.添加(新狗(966,0.92,“A”);
列表1.添加(新狗(966,0.97,“C”);
列表1.添加(新狗(92,1.0,“A”);
//使用比较器对数组列表排序
Collections.sort(list1,newdog());
for(Dog a:list1)//打印已排序的年龄列表
System.out.println(a.getCountryCode()+“:”+
a、 getOperator()+”:“+a.getPrice());
int index=Collections.binarySearch(list1,newdog(92,null,null));
如果(索引>=0)
System.out.println(list1.get(index.getOperator()+“”+list1.get(index.getPrice());
其他的
System.out.println(“没有操作员可用”);
}}

您从未按价格对列表进行排序,因此您不应该期望得到最低价格

乍一看,列表是按照国家代码的顺序排序的

每个国家/地区代码内的价格顺序是随机的,取决于:

  • 原始列表的未指定排序顺序
  • 二进制搜索找到的第一个值具有正确的国家代码
罗尔夫

编辑:

你问什么是正确的方法。。。。我想到了三点:

  • 使用Kent建议的预先构建的层次结构,对两个维度(国家/地区/价格)的数据进行排序,然后您可以快速提取所需的数据
  • 将comparator更改为按国家/地区和价格排序,然后扫描列表(而不是二进制搜索),并返回具有正确国家/地区的第一个项目
  • 将比较器更改为按国家和价格进行排序,然后使用二进制搜索搜索国家(二进制搜索将返回具有该国家的任何位置),然后向后扫描以查找最低价格

您从未按价格对列表进行排序,因此您不应该期望得到最低价格

乍一看,列表是按照国家代码的顺序排序的

每个国家/地区代码内的价格顺序是随机的,取决于:

  • 原始列表的未指定排序顺序
  • 二进制搜索找到的第一个值具有正确的国家代码
罗尔夫

编辑:

你问什么是正确的方法。。。。我想到了三点:

  • 使用Kent建议的预先构建的层次结构,对两个维度(国家/地区/价格)的数据进行排序,然后您可以快速提取所需的数据
  • 将comparator更改为按国家/地区和价格排序,然后扫描列表(而不是二进制搜索),并返回具有正确国家/地区的第一个项目
  • 将比较器更改为按国家和价格进行排序,然后使用二进制搜索搜索国家(二进制搜索将返回具有该国家的任何位置),然后向后扫描以查找最低价格

如果您的要求是:
如果找到多条具有相同国家代码的狗,请以最低价格返回该狗。

我建议你改变你的列表设计

您可以有一个
Map
键是
countryCode
。当然,
Map
或番石榴
MultiMap
也可以

如果
countrycode
实际上是国家,则地图上的条目不会超过300个

然后您可以保存该
O(logn)
二进制搜索。并使用
O(1)
获取相同国家代码的狗的列表/集合/树集

然后,如果没有排序,您可以按价格对收集的狗进行排序(
O(nlogn)
)(您应该输入可比较的接口和方法)并获得第一只/最后一只狗。取决于您的排序顺序。您还可以对集合进行排序,以备以后使用。如果这只是一次性的工作,你甚至可以通过收集狗,以最低的价格得到狗<代码>O(n)

如果您想让运算符也进行排序,请将该信息写入i