Java-TreeSet使用比较器排序

时间:2015-09-29 03:27:10

标签: java data-structures treeset

我必须写一个程序

  1. 使用类ShopItem,其中项目属性的项目为:barCodeNumber,itemName,price和quantityInStock。使用我自己的属性值创建5个ShopItems实例(item1,item2,item3,item4和item5)。
  2. 使用ShopItem的比较器(barCodeComparator),它允许基于barCodeNumber比较ShopItem对象(假设:没有两个项目永远不会有相同的barCode)。

  3. 确保无法将具有相同barCodeNumber的两个项目添加到Set中。

  4. 我被困在第3部分。我知道我必须使用HashSet,但我不知道如何在这个使用排序的程序中实现它。我很抱歉,由于我在几小时内完成数据结构测试,因此我的时间不多了。

    这是shopItem.java类

    public class ShopItem implements Comparable<ShopItem> {
    
    private int barCodeNumber;
    private String itemName;
    private int price;
    private int quantityInStock;
    
    public ShopItem(int barCodeNumber, String itemName, int price, int quantityInStock){
    
        this.barCodeNumber= barCodeNumber;
        this.itemName= itemName;
        this.price= price;
        this.quantityInStock= quantityInStock;
    }
    
    
    public int getBarCodeNumber() {
        return barCodeNumber;
    }
    
    
    public void setBarCodeNumber(int barCodeNumber) {
        this.barCodeNumber = barCodeNumber;
    }
    
    
    public String getItemName() {
        return itemName;
    }
    
    
    public void setItemName(String itemName) {
        this.itemName = itemName;
    }
    
    
    public int getPrice() {
        return price;
    }
    
    
    public void setPrice(int price) {
        this.price = price;
    }
    
    
    public int getQuantityInStock() {
        return quantityInStock;
    }
    
    
    public void setQuantityInStock(int quantityInStock) {
        this.quantityInStock = quantityInStock;
    }
    
    @Override
    public String toString(){
        return "Item: " + itemName+ ":"+ "Bar Code Reader: "+barCodeNumber;
       }
    
    }
    

    这是ShopItem_Order.java类

    import java.util.*;
    
    public class ShopItem_Order {
    final static Comparator<ShopItem> BarCodeComparator= new Comparator<ShopItem>(){
    
        public int compare(ShopItem A, ShopItem B){
    
            if(new Integer(A.getBarCodeNumber()).compareTo(new Integer(B.getBarCodeNumber()))<0)
    
                return -1;
    
                else if(new Integer(A.getBarCodeNumber()).compareTo(new Integer(B.getBarCodeNumber()))>0)
    
                   return 1;
    
                else
                    return 0;
    
       }
    
    };
    
    
    
        public static void main(String args[]){
    
            SortedSet<ShopItem> item= new TreeSet<ShopItem>(new ShopItem_Comparator());
    
            ShopItem a= new ShopItem(42842, "Iced Green Tea", 75, 20);
            ShopItem b= new ShopItem(42278, "Sugar Free Lindt Choc", 175, 20);
            ShopItem c= new ShopItem(42277, "Red Velvet Cake", 125, 15);
            ShopItem d= new ShopItem(42857, "Financier Cake", 150, 11);
            ShopItem e= new ShopItem(48423, "Tacos", 125, 10);
    
    
            item.add(a);
            item.add(b);
            item.add(c);
            item.add(d);
            item.add(e);
    
            for(ShopItem si: item){
                System.out.println(si.toString());
            }
    
    
    
        }
    

    }

2 个答案:

答案 0 :(得分:0)

由于条形码作为唯一标准,您可以将其用于hashCode计算。例如。返回new Integer(barCodeNumber).hashCode()。请注意,您还需要实现equals()方法,该方法也将基于barCodeNumber。

答案 1 :(得分:0)

既然你已经有了比较器,为什么必须使用HashSet而不是TreeSet呢?以与比较器一致的方式实现equalsTo(参见https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html)。

如果要求排序,您应该坚持使用提供排序的TreeSet。 Hashset依赖于哈希值,因此没有排序。

您的比较器也可以简化为一个衬垫:

return Integer.valueOf(a.getBarcodeNumber().compare(Integer.valueOf(b.getBarCodeNumber());