Java-搜索对象字段的哈希集

Java-搜索对象字段的哈希集,java,oop,hashset,Java,Oop,Hashset,我在自学Java,我有一个简单的软件包,包含三个类:shop、product和shelf。商店对象包含多个货架,货架包含多个产品,在本例中,每个产品仅在一个货架上可用 产品如下所示: public class t_product { private t_shelf shelf; private String name; } public class t_shelf { private Set<t_product> products = new Has

我在自学Java,我有一个简单的软件包,包含三个类:shop、product和shelf。商店对象包含多个货架,货架包含多个产品,在本例中,每个产品仅在一个货架上可用

产品如下所示:

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<>();
}
架子是这样的:

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<>();
}
将设置myproduct.shelf=myshelf,并将myproduct添加到myshelf.products。这很好,并且很好地处理了关系。类似的功能连接商店和货架

继续讨论这个问题 我有一个.csv文件,其中存储:

Product   |   Shelf
----------------------
Hats      |   Headwear
Helmets   |   Headwear
Socks     |   Footwear
Apples    |   Fruit
Bananas   |   Fruit
Oranges   |   Fruit
在解析.csv时,我想按名称搜索shelf,查看它是否已经创建,因此,例如,在读取一行“香蕉,水果”时,它将处理:

if (!myshop.getShelfByName("Fruit")){
       myshop.addShelf(new t_shelf("Fruit"));
   }
myshop.getShelfByName("Fruit").addProduct("Bananas"); //Constructors accept the name as a parameter.
我的问题是: GetShellfByName(字符串名)的实现是否比简单地迭代HashSet并针对每个项目检查名称更简洁?(希望避免O(N)算法)

谢谢
任何解决此问题的尝试都受到了热烈的欢迎:)

如果您要创建要保存在哈希集中的对象类,则必须为这些类提供适当的
equals()
hashCode()
重写方法,这些方法有意义并且可以很好地协同工作(对于一个类,使用相同的不变字段来确定其结果).


至于你的特定问题,考虑把东西放在哈希表中,而不是哈希集,这样你就可以用它的键轻松地找到对象。

< P>你应该把你的书架存放在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");
public class t_shop{
私有映射工具架=新HashMap();
公共空白添加架(t_架){
shelfs.put(t_-shelf.getName(),t_-shelf);
}
公共tshelf getShelfByName(字符串名称){
返回货架。获取(名称);
}
}
t_shelf shelf=myshop.getShelfByName(“水果”);
如果(空!=工具架){
货架=新的t_货架(“水果”);
addShelf(shelf);
}
货架。添加产品(“香蕉”);

使用
HashMap
而不是
集合
会使查找命名的工具架变得微不足道:

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

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

    t_shelf shelf = shelves.get(name);

    shelf.addProduct(product);
private Map shelfs=new HashMap();
// ...
if(sheels.contains(name)){
t_shelf=shelfs.get(名称);
货架。添加产品(产品);