Java 如何为每个对象创建树集

Java 如何为每个对象创建树集,java,treeset,Java,Treeset,我有一个项目,我需要用java制作一个erp系统。假设我们有一个灯作为产品,这个灯由螺丝、灯泡等部件组成。 所以我的第一个猜测是使用一个树集,并将这些部件放在每个产品树集中。但我只有一类产品,所以如果我做了一个新产品,我该如何给这个新产品一个树集 下面是specifik类产品的代码 private String productID; private String productName; private double productPrice; public ArrayList<Produ

我有一个项目,我需要用java制作一个erp系统。假设我们有一个灯作为产品,这个灯由螺丝、灯泡等部件组成。 所以我的第一个猜测是使用一个树集,并将这些部件放在每个产品树集中。但我只有一类产品,所以如果我做了一个新产品,我该如何给这个新产品一个树集

下面是specifik类产品的代码

private String productID;
private String productName;
private double productPrice;
public ArrayList<Products> prod = new ArrayList<>();


public Products(String productID,String productName, double productPrice)
{
    this.productName = productName;
    this.productID = productID;
    this.productPrice = productPrice;

}

注:此答案已编辑。它最初建议克隆存储在地图中的产品,但由于担心膨胀,它改为使用单例

如果product类有一个子产品部件列表,那么这些子部件中的每个都有一个部件列表

要获取产品的直接子级,可以使用getPartId方法,该方法只返回ChildPartId列表中的元素。 要获取构成此产品的所有部件,可以使用getAllComponentDS方法,该方法将递归遍历子部件列表并返回包含所有部件的列表

一旦您创建了一个产品,我建议您按名称将其存储在地图中。我目前假设每种产品的单例是可以接受的。然后处理ProductID和计数,而不是产品实例

这看起来像下面的注释,它只是伪编码的,不会编译:

protected Hashtable<String,Product> productsMap;

public static void CreateProductType(String productId, String productName, dobule ProductPrice, String[] partProductIDs)
{
    // TODO: error case checking
    Product newProduct = new Product(productID, productName, double productPrice, partProductNames)
    productsMap.add(productID, newProduct);
}    

protected Product(String productID,String productName, double productPrice, String[] partProductIDs)
{
    this.productName = productName;
    this.productID = productID;
    this.productPrice = productPrice;
}

public String[] getPartIDs()
{
   return partProductIDs;
}

public static String[] getPartIDs(String productID)
{
   Product p =  productsMap.get(productID);
   return p.partProductIDs();
}

public static String[] getAllComponentIDs(String productID)
{
   Product p =  productsMap.get(productID);
   String[] parts = p.getPartIDs();
   foreach (String productId : parts) {
       // add all child component ids to an array/list and return it
   }

}

你应该按照普利基斯的建议使用地图,但不能按照他建议的方式使用。每个产品都可以包含其子产品的地图。不知道为什么你提到膨胀你的数据库,因为这是所有关于参考。没有涉及到对象的克隆

private String productID;
private String productName;
private double productPrice;
public Hashtable<String,Product> childProducts;


public Products(String productID,String productName, double productPrice)
{
    this.productName = productName;
    this.productID = productID;
    this.productPrice = productPrice;
}

public Products(String productID,String productName, double productPrice, Products[] newChildProducts)
{
    this.productName = productName;
    this.productID = productID;
    this.productPrice = productPrice;

    AddChildProducts(newChildProducts);
}

public String GetProductID()
{
    return productID;
}

public void AddChildProduct(Product product)
{
    InitializeChildProducts();
    childProducts.put(product.GetProductID(),product);
}

private void InitializeChildProducts()
{
    if (childProducts == null)
    {
        childProducts = new Hashtable<String,Product>();
    }
}

public void AddChildProducts(Product[] products)
{
    InitializeChildProducts();
    for (Product prod : products)
    {
        childProducts.put(prod.GetProductID(),prod);
    }
}

public Hashtable<String,Product> GetChildProducts()
{
    InitializeChildProducts()
    return childProducts;
}

“我只有一类产品”你的意思是你不能改变这类产品吗?我不确定我是否理解你想要实现的目标。您是否试图确定给定产品的子产品的所有子产品和子产品的后代?与其使用每个子产品的一个类来制造许多不同的产品,不如使用一个产品类。那么,问题是什么?你有一个类-产品顺便说一句,最好叫它产品。现在,您可以根据需要创建该类的任意多个对象。是的,但产品有许多零件,零件可以位于多个产品中。因此,我们不能简单地为每个产品创建一个带有树集的seperate类来放置零件。这就是为什么我们不能让一个实例在部件中可变以设置它是哪个产品的原因。这看起来像是我们问题的解决方案,但是如果我们有1000个部件,我们需要克隆它们,那么我们的数据库就满了,我们只需要每个部件一次,但我们希望能够将它们添加到多个产品中。我最初建议创建一个每个产品类型的实例,然后在需要时获取和克隆它们,但由于他过于担心,所以修改了我的解决方案以使用singleton。我将更新我的答案以反映这一点。