I am teaching myself Java and I have a simple package with three classes – shop, product and shelf. A shop object contains many shelves, and a shelf contains many products, and, in this case, each product is only available on one shelf.
A product looks like this:
public class t_product {
private t_shelf shelf;
private String name;
}
And a shelf looks like this:
public class t_shelf {
private Set<t_product> products = new HashSet<>();
private String name;
}
The shop object looks like this:
public class t_shop {
private Set<t_shelf> shelves = new HashSet<>();
}
I also have a set of functions which will add or remove a product from the shelf.
myshelf.addProduct(myproduct);
will set myproduct.shelf = myshelf, and add myproduct to myshelf.products. This works fine, and handles the relationship nicely. Similar functions link shop and shelves.
Moving on to the problem
I have a .csv which stores:
Product | Shelf
----------------------
Hats | Headwear
Helmets | Headwear
Socks | Footwear
Apples | Fruit
Bananas | Fruit
Oranges | Fruit
When parsing the .csv, I want to search for the shelf by name to see if it has already been created, so, for example, on reading a line “Bananas, Fruit”, it would process:
if (!myshop.getShelfByName("Fruit")){
myshop.addShelf(new t_shelf("Fruit"));
}
myshop.getShelfByName("Fruit").addProduct("Bananas"); //Constructors accept the name as a parameter.
My question is:
Is there a neater implementation of getShelfByName(String name) than simply iterating through the HashSet and checking for the name against every single item? (Want to avoid O(N) algorithms).
Thanks!
Any attempt to solve this VERY gratefully received 🙂
If you’re creating classes of objects to be held in a HashSet, you must give these classes decent
equals()andhashCode()override methods, ones that make sense and that play well together (that for one use the same invariant fields to determine their results).As for your specific question, consider putting things in HashMaps rather than HashSets, as then you can easily find the object by its key.