2

私は自分自身にJavaを教えており、ショップ、製品、棚の3つのクラスからなるシンプルなパッケージを持っています。ショップオブジェクトには多くの棚が含まれ、棚には多くの商品が含まれます。この場合、各商品は1つの棚でのみ使用できます。

製品は次のようになります。

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を解析するときに、名前でシェルフを検索して、すでに作成されているかどうかを確認したいので、たとえば、「Bananas、Fruit」という行を読み取ると、次のように処理されます。

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

私の質問は:

単にHashSetを反復処理し、すべてのアイテムに対して名前をチェックするよりも、getShelfByName(String name)の優れた実装はありますか?(O(N)アルゴリズムを避けたい)。

ありがとう!

これを解決する試みは非常にありがたいことに受けました:)

4

3 に答える 3

4

HashSetに保持されるオブジェクトのクラスを作成する場合は、これらのクラスに適切なメソッドとオーバーライドメソッドを指定する必要があります。これらのメソッドは、意味があり、一緒にうまく機能します(同じ不変フィールドを使用して結果を決定します)。equals()hashCode()

特定の質問については、HashSetsではなくHashMapsに配置することを検討してください。そうすれば、オブジェクトをそのキーで簡単に見つけることができます。

于 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

HashMapの代わりにを使用するSetと、名前付きの棚を探すのが簡単になります。

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 に答える