【问题标题】:Java- TreeSet sorting using comparatorJava- TreeSet 使用比较器排序
【发布时间】:2015-09-29 03:27:10
【问题描述】:

我要写一个程序

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

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

我被困在第三部分。我知道我必须为此使用 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());
        }



    }

}

【问题讨论】:

    标签: java data-structures treeset


    【解决方案1】:

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

    【讨论】:

    • 地图一无所有。提到的 TreeSet 是一个不错的选择,只是为了实现 equals() 正常工作
    【解决方案2】:

    既然你已经有了一个比较器,为什么你必须使用 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());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-28
      • 2020-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多