2

我正在自学 Java,我有一个包含三个类的简单包——商店、产品和货架。一个商店对象包含许多货架,一个货架包含许多产品,在这种情况下,每个产品仅在一个货架上可用。

一个产品看起来像这样:

public class t_product {
    private t_shelf shelf;
    private String name;
}

一个架子看起来像这样:

public class t_shelf {    
    private Set<t_product> products = new HashSet<>();
    private String name;
}

商店对象如下所示:

public class t_shop {    
    private Set<t_shelf> shelves = new HashSet<>();
}

我还有一组功能可以在货架上添加或删除产品。

myshelf.addProduct(myproduct);

将设置 myproduct.shelf = myshelf,并将 myproduct 添加到 myshelf.products。这很好用,并且很好地处理了这种关系。类似的功能链接商店和货架。

继续解决问题

我有一个 .csv 存储:

Product   |   Shelf
----------------------
Hats      |   Headwear
Helmets   |   Headwear
Socks     |   Footwear
Apples    |   Fruit
Bananas   |   Fruit
Oranges   |   Fruit

解析 .csv 时,我想按名称搜索架子以查看它是否已经创建,因此,例如,在读取“香蕉,水果”行时,它将处理:

if (!myshop.getShelfByName("Fruit")){
       myshop.addShelf(new t_shelf("Fruit"));
   }
myshop.getShelfByName("Fruit").addProduct("Bananas"); //Constructors accept the name as a parameter.

我的问题是:

getShelfByName(String name) 有没有比简单地遍历 HashSet 并针对每个项目检查名称更简洁的实现?(想要避免 O(N) 算法)。

谢谢!

非常感谢任何解决此问题的尝试:)

4

3 回答 3

4

如果您正在创建要保存在 HashSet 中的对象类,则必须为这些类提供体面的equals()hashCode()覆盖的方法,这些方法有意义并且可以很好地协同工作(对于一个人来说,使用相同的不变字段来确定它们的结果)。

至于您的具体问题,请考虑将内容放在 HashMaps 而不是 HashSets 中,因为这样您就可以通过其键轻松找到对象。

于 2012-06-30T19:58:17.833 回答
2

您应该将您的书架存储在 HashMap 中(键应该是书架的名称)。您将拥有一个 O(1) 算法。

public class t_shop {    
    private Map<String, t_shelf> shelves = new HashMap<String, t_shelf>();

    public void addShelve(t_shelf) {
        shelves.put(t_shelf.getName(), t_shelf);
    }

    public tshelf getShelfByName(String name) {
        return shelves.get(name);
    }
}


t_shelf shelf = myshop.getShelfByName("Fruit");
if (null != shelf){
    shelf = new t_shelf("Fruit");
    myshop.addShelf(shelf);
}
shelf.addProduct("Bananas");
于 2012-06-30T20:01:04.807 回答
1

使用 aHashMap而不是 aSet会使查找命名架子变得微不足道:

private Map<String, t_shelf> shelves = new HashMap<>();

// ...
if (shelves.contains(name)) {

    t_shelf shelf = shelves.get(name);

    shelf.addProduct(product);
于 2012-06-30T20:02:32.403 回答