Сортировка Java-TreeSet с использованием компаратора

Я должен написать программу, которая

  1. использует класс ShopItem, в соответствии с которым атрибуты элемента: barCodeNumber, itemName, цена и количествоInStock. Создайте 5 экземпляров ShopItems (item1, item2, item3, item4 и item5) с моими собственными значениями для их атрибутов.
  2. использует компаратор (barCodeComparator) для ShopItem, который позволяет сравнивать объекты ShopItem на основе их barCodeNumber (предположение: два предмета никогда не будут иметь одинаковый barCode).

  3. гарантирует, что два элемента с одинаковым barCodeNumber не могут быть добавлены в набор.

Я застрял на 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());
        }



    }

}


person Tia    schedule 29.09.2015    source источник


Ответы (2)


поскольку ваш штрих-код является уникальным критерием, вы можете использовать его для расчета хэш-кода. Например. вернуть новое целое число (barCodeNumber).hashCode(). Имейте в виду, что вам также необходимо реализовать метод equals(), который также будет основан на barCodeNumber.

person Stan    schedule 29.09.2015
comment
Про карту ничего нет. Упомянутый TreeSet - хороший выбор, просто чтобы реализовать equals() для правильной работы. - person Stan; 29.09.2015

Поскольку у вас уже есть компаратор, почему вы должны использовать 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());
person alampada    schedule 29.09.2015