Java - 尝试使用自定义比较器对 LinkedList 进行排序,找不到符号排序

标签 java sorting comparator

我一直在尝试创建一些方法,以至少 4 种不同的方式对链接列表进行排序。但我不断收到编译器错误

MyBikeList.java:80: cannot find symbol
symbol  : method sort(java.util.List<Bike>,Comparator<Bike>)
location: class java.util.Collections
                Collections.sort(bikeInventory, byYear);

我的代码如下(不完整)

    public class MyBikeList implements BikeList
{

    List<Bike> bikeInventory = new LinkedList();
    public static Comparator<Bike> byPrice = new PriceComparator();
    public static Comparator<Bike> byYear = new YearComparator();
    public static Comparator<Bike> byModel = new ModelComparator();
    public static Comparator<Bike> byReg = new RegComparator();

    public boolean add(Bike bike)
    {
    {

    }

    public boolean remove(Bike bike)
    {
    }

    public Bike find(String regNo)
    {
        ListNode itr = header.next;

        while( itr != null && !itr.element.equals( Bike.bikeRegNO ) )
        {
            itr = itr.next;
        }

        return new LinkedListIterator( itr );
    }

    public int sortByRegNo()
    {
        Collections.sort(bikeInventory, byReg);
        return byReg.getCount();
    }

    public int sortByPrice()
    {
        Collections.sort(bikeInventory, byPrice);
        return byPrice.getCount();

    }

    public int sortByModel()
    {
        Collections.sort(bikeInventory, byModel);
        return byModel.getCount();

    }

    public int sortByYear()
    {
        Collections.sort(bikeInventory, byYear);
        return byYear.getCount();

    }
    public void clear()
    {
        bikeInventory.clear();
    }

    public int size()
    {
        int s = bikeInventory.size();
        return s;
    }
}



   import java.util.*;

public interface Comparator<T>
{

    int compare(T o1, T o2);
    int getCount();
}

    import java.util.*;

public class PriceComparator implements Comparator<Bike>
{

    private int count;


    public int compare(Bike b1, Bike b2)
    {
        int b1Pr = b1.getPrice();
        int b2Pr = b2.getPrice();

        if(b1Pr > b2Pr)
        {
            count++;
            return 1;
        }
        if(b1Pr == b2Pr)
        {
            return 0;
        }

        return -1;
    }

    public int getCount()
    {
        return count;
    }
}

import java.util.*;

public class YearComparator implements Comparator<Bike>
{

    private int count = 0;

    public int compare(Bike b1, Bike b2)
    {
        int b1Yr = b1.getYear();
        int b2Yr = b2.getYear();


        if(b1Yr > b2Yr)
        {
            count++;
            return 1;
        }
        else
        if(b1Yr == b2Yr)
        {
            return 0;
        }

        return -1;
    }

    public int getCount()
    {
        return count;
    }

}

import java.util.*;

public class RegComparator implements Comparator<Bike>
{

    private int count;


    public int compare(Bike b1, Bike b2)
    {
        String b1Reg = b1.getRegNo();
        String b2Reg = b2.getRegNo();

        int result = b1Reg.compareTo(b2Reg);

        if(result > 0)
        {
            count++;
            return 1;
        }
        if(result == 0)
        {
            return 0;
        }

        return -1;
    }

    public int getCount()
    {
        return count;
    }

}

import java.util.*;

public class ModelComparator implements Comparator<Bike>
{

    private int count;

    public int compare(Bike b1, Bike b2)
    {
        String b1Model = b1.getModel();
        String b2Model = b2.getModel();

        int result = b1Model.compareTo(b2Model);

        if(result > 0)
        {
            count++;
            return 1;
        }
        if(result == 0)
        {
            return 0;
        }

        return -1;
    }

    public int getCount()
    {
        return count;
    }
}

public class MyBike implements Bike
{

  private String bikeModel;
  private String bikeRegNo;
  private String bikeYear;
  private String bikePrice;
  private int counter;

  public MyBike (String model, String regNo, String year, String price)
  {
        bikeModel = model;
        bikeRegNo = regNo;
        bikeYear = year;
        bikePrice = price;
        counter = 0;
    }


    public String getModel()
    {
        return bikeModel;
    }

    public String getRegNo()
    {
        return bikeRegNo;
    }

    public int getYear()
    {
        int aYear = toInt(bikeYear);
        return aYear;
    }

    public int getPrice()
    {
        int aPrice = toInt(bikePrice);
        return aPrice;
    }

    public void setPrice(int newPrice)
    {

        bikePrice = "" + newPrice;
    }

    public int getCompCount()
    {
        int tempInt = counter;
        counter = 0;
        return tempInt;
    }

    public boolean match(String model, int year, int price)
    {
        boolean nearMatch = false;
        int pricePercent = getPrice() /10;  
        if(model != null)
        {
            nearMatch = true;
        }

        if((year > 0) && (year >= getYear() -1) && (year <= getYear() + 1))
        {
            nearMatch = true;
        }

        if((price > 0) && (price >= getPrice() - pricePercent) && (price <= getPrice() + pricePercent))
        {
            nearMatch = true;
        }

        if(nearMatch == true)
        {
            counter++;
        }

        return nearMatch;


    }

    public String toString()
    {
        String aString = ("" + getPrice() + "   " + getYear()
                                + " " + getRegNo() + "  " +
                                getModel());
        return aString;
    }

    public int toInt(String s)
    {
        int anInt = Integer.parseInt(s);
        return anInt;
    }

    public int compareTo(Bike b)
    {
        int result = getRegNo().compareTo(b.getRegNo());
        if (result < 0)
        {
            return -1;
        }
        if (result == 0)
        {
            return 0;
        }

        return 1;

    }   

    public void compare(Bike b)
    {
    }

}


public interface Bike extends Comparable<Bike>
{
    /**
     * Get the bike's model description
     * @return  the model
     */
    public String getModel();

    /**
     * Get the bike's registration number
     * @return  the regNo
     */
    public String getRegNo();

    /**
     * Get the bike's year of registration
     * @return  the year
     */
    public int getYear();

    /**
     * Get the bike's price
     * @return  the price
     */
    public int getPrice();

    /**
     * Set the bike's price
     * @param price  the price
     */
    public void setPrice(int price);

    /**
     * Get & reset the comparison counter value
     * @return  the count (before resetting to zero)
     */
    public int getCompCount();

    /**
     * Check for "near match" (see assignment brief for details)
     * @param model  ignore if null/empty, else match as substring, 
     * if substring is engine size e.g. "800cc", remove number substring 
     * and convert to a number and match to within 50
     * @param year   ignore if <= 0, else match to within 1 yr
     * @param price  ignore if <= 0, else match to within 10%
     * @return  true if "near match" as above, else false
     */
    public boolean match(String model, int year, int price);

    /**
     * Create a string with price, year, regNo & model description
     * concatenated in that order, separated by single tabs
     * @return  a printable string as above 
     */
    public String toString();
}
    public interface BikeList
{
    /**
     * Add a given bike object to the list
     * @param bike  the bike object to add
     * @return  true if successful, else false
     */
    public boolean add(Bike bike);

    /**
     * Remove a bike object from the list
     * @param bike  the bike object to remove
     * @return  true if successful, else false
     */
    public boolean remove(Bike bike);

    /**
     * Find a bike given its registration number
     * @param regNo  the registration number
     * @return  the bike object, or null if not found
     */
    public Bike find(String regNo);

    /**
     * Sort by registration number
     * @return  the number of comparisons
     */
    public int sortByRegNo();

    /**
     * Sort by registration year
     * @return  the number of comparisons
     */
    public int sortByYear();

    /**
     * Sort by price
     * @return  the number of comparisons
     */
    public int sortByPrice();

    /**
     * Sort by model description
     * @return  the number of comparisons
     */
    public int sortByModel();

    /**
     * Clear the list
     */
    public void clear();

    /**
     * Get the size of the list (= number of bikes)
     * @return  the list size
     */
    public int size();

    /**
     * Convert list to single string with \n after each record
     * @return the string as above
     */
    public String toString();

    /**
     * Get an iterator object to traverse the bike list
     * @return  a java.util.Iterator<Bike> object
     */
    public java.util.Iterator<Bike> iterator();
}

预先感谢您,抱歉篇幅较长,我不确定有多重要。

谢谢!

最佳答案

我认为问题在于:

import java.util.*;

public interface Comparator<T>
{

    int compare(T o1, T o2);
    int getCount();
}

您正在定义自己的比较器接口(interface)。相反,您应该摆脱此接口(interface)并使用java.util.Comparator

http://download.oracle.com/javase/6/docs/api/java/util/Comparator.html

关于Java - 尝试使用自定义比较器对 LinkedList 进行排序,找不到符号排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5453704/

相关文章:

Java 时间戳,无法获取正确的值

java - x 实例的 JPA 标识符已更改

Java RMI - 客户端到服务器调用

c - 该项目的目标是展示排序算法的知识

java - java中优先级队列的比较器

java - 来自父 pom 的 Maven 依赖管理覆盖 ${project.version}

vba - 宏 - 按列名称多级排序

node.js - MongoDB 按其他文档中的属性排序

java - 根据对象属性对对象数组列表进行排序

java - java 8 lambda 表达式使用函数变量工作而不是内联工作的任何解释