如何从子产品列表中找到产品的最低价格

时间:2019-06-17 18:32:40

标签: java algorithm

我正在制作一个程序,它将txt文件作为输入,并找到产品列表的最佳价格

例如

teddy bear
painted glass eyeball,10.5,2,glass;paint 
glass,5,0,
paint,4,0,
teddy bear,null,4,painted glass eyeball;tiny shirt;faux bear fur fabric;sewing thread
faux bear fur fabric,15,2,bear;yarn
bear,100,0,
yarn,2,0,
sewing thread,13,0,
tiny shirt,24,0,

在以下示例中,我们的target_product是泰迪熊,在第5行,它为null(意味着您将无法购买整个泰迪熊),而第4行是input_product_size,代表制作target_product所需的产品数量,其余为input_products

第2行中的彩绘玻璃眼球可以10.5美元的价格购买,也可以用两种成分制成,玻璃,油漆

只需5美元就可以买到

玻璃杯,而且不需要其他成分。 油漆只需4美元即可购买,不需要其他任何成分。 但是由于制作彩绘玻璃眼球的成本为9美元,而购买成本为10.5美元,我们将取代购买它。

小巧的衬衫可以花24美元买到 人造熊皮毛面料的价格为15美元,或者可以用熊和纱这两种成分制成 可以100美元买到熊 纱可以花2美元买到 但是由于熊和纱的总和为$ 102,大于$ 15,因此,我们只买面料而不是做。 缝纫线可以花13美元买到

因此,泰迪熊的最低价格的总输出应为

9+24+15+13=61

另一个例子是做一个三明治

sandwich
mayonnaise,1,0,
sand,0,0,
bread,3,3,yeast;water;flour
flour,1,0,
water,1,0,
yeast,1,0,
sandwich,10,6,mayonnaise;sand;bread;mozzarella;bacon;salt
bacon,3,1,pig
pig,1000,0,
salt,1,2,sea salt;iodine
iodine,40,0,
sea salt,.5,0,
mozzarella,3,0,

我们发现三明治可以10美元购买,或者可以用这条线中的6种成分制成

sandwich,10,6,mayonnaise;sand;bread;mozzarella;bacon;salt

mayo售价1美元

沙成本$ 0

面包的成本为3美元或需要制作3种成分:面粉,水和酵母

面粉成本$ 1 水费$ 1 酵母的价格是1美元

因此,制造和购买产品都不会有所作为 芝士成本$ 3

培根成本3美元,或需要制作1种成分:猪 因为猪的价格是1000美元,所以我们只需花3美元就可以买到培根。

盐的价格为1美元,或需要2种成分才能制成:海盐和碘 由于海盐和碘的总和为40.5美元,超过1美元,因此我们可以购买海盐。

制作此三明治的总费用

Mayo $1
Sand $0
Bread $3
Bacon $3
Mozarella $3
Salt $1 

-------------
Total: $11

但由于购买此三明治仅需10美元,因此我们的产出将为10美元。

import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;

public class BestPrice {

    public static void main(String[] args) throws IOException {

        BufferedReader in = new BufferedReader(new FileReader("teddybear.txt"));

        // BufferedReader in = new BufferedReader(reader);
        String line, input_products = null;

        // setting first line as our target product
        String target_product = in.readLine();

        int finalprice = 0, totalPrice = 0, input_product_size = 0;

        while ((line = in.readLine()) != null) {

            String[] words = line.split(",");
            for (String word : words) {
                if (word.equals(target_product)) {
                    if (words[1].equals("null")) {
                        // find the line where the target_product is,
                        // and parse it to get the rest of the information
                        String product_name = words[0];
                        String price_to_purchase = words[1];
                        input_product_size = Integer.parseInt(words[2]);
                        input_products = words[3];
                        if (input_product_size != 0) {
                            String[] ingredients = words[3].split(";");
                            for (int i = 0; i < ingredients.length; i++) {
                                if(word.equals(ingredients[i])) {}
                            }
                        }
                        // System.out.println(product_name + ", " + price_to_purchase + ", " +
                        // input_products);
                    } else {
                        // keep track of the cost of buying target_product
                        finalprice += Integer.parseInt(words[1]);
                    }
                }
            }
            if (input_product_size > 1) {

            }
        }
        System.out.println(finalprice);

    }

}

我正在考虑2D数组,甚至是列表的哈希图,但我肯定在这里实现此目标的最佳方法。任何指针将不胜感激!

1 个答案:

答案 0 :(得分:1)

创建一个代表每种产品的类,如下所示:

public class Product {
    private String name;
    private double price;
    private Product[] ingredients;
    ...
    public Product(String name, double price, Product... ingredients) {
        // populate instance variables
    }
}

我无法确定您的输入应该是什么,因此显然您可能在该类中有更多字段。看起来好像是CSV格式,但是格式严重错误。您可以根据需要添加getter和setter。

创建该类之后,您只需创建一个List<Product>并使用您输入的值填充它即可。

长时间编辑: 使用您的三明治示例,我们有输入sandwich,10,6,mayonnaise;sand;bread;mozzarella;bacon;salt。用逗号将其分割成一个数组:

["sandwich","10","6","mayonnaise;sand;bread;mozzarella;bacon;salt"]

我们假设该数组的名称与您的代码中的名称相同,称为words。给定实例的Product#name将是words[0]Product#price将是words[1],依此类推。您还必须在分号上拆分words[3]或配料列表,然后将其传递。

您还必须找到一种使用这些名称构造Product对象的方法,因为现在您不知道这些成分的价格是多少。一种可行的方法是创建一个已知Products的“缓存”并按名称搜索它。另一种方法是在输入中提供成分的价格。

希望这可以解决一些问题。我知道这是很长的阅读。