gpt4 book ai didi

java - 从结果中识别出 "best bang for the buck"项

转载 作者:行者123 更新时间:2023-11-30 02:36:43 27 4
gpt4 key购买 nike

我需要你们的帮助,因为我被这个问题困住了。

如何从以下结果中以编程方式识别并打印每个类别仅 1(一个)“性价比最高”记录?考虑到单价、运营成本和投资回收时间。

有通用的公式吗?

我有一段 Java 代码,它通过一些计算从数据库获取一些数据,并生成下面的结果。

ABProduct abproduct = null;
ArrayList result_new = new ArrayList();
result_new.addAll(ProductDao.getProdutcs(customer, country));

if(result_new!=null){
for(int i=0; i<result_new.size(); i++) {
abproduct = (ABProduct) result_new.get(i);
aID = abproduct.getID();
aName = abproduct.getName();
aPrice = abproduct.getPrice();
aCategory = abproduct.getCategory();

//The below variable are calculated on fly
aCost = ...
aPaybackTime = ...

//Here I print the results
}
}

结果如下所示:

ID  Name     Unit Price  Category  Operating Cost   Payback Time

11 AA1CC0 88.41 3 146.5 4.6
9 AA22VB 64.99 3 146.94 1.9
10 AA3BN5 79.69 3 147.51 4.1
18 AA47VV 88.08 3 147.63 5.3
17 AA5HJ2 79.32 3 149.55 5.6
16 AA61YA 75.24 3 150.16 5.4

21 AA9Y0A 104.99 5 140.74 3.9
33 AA10DA 182.03 5 140.74 9.4
40 AA11K1 119.99 5 140.82 5
32 AA121D 154.99 5 141.25 7.7
27 AA13S1 159.89 5 141.8 8.5
38 AA1433 102.05 5 141.93 4
41 AA15D0 139.99 5 141.97 7
31 AA166D 109.89 5 142.07 4.7
36 AA17D3 149.99 5 142.07 7.9
30 AA187H 99.99 5 142.17 4
35 AA19G5 129.99 5 142.17 6.3
22 AA20P4 119.99 5 142.39 5.6
39 AA21K8 109.95 5 142.52 4.9
20 AA228I 88.84 5 142.81 3.2
29 AA239O 92.47 5 142.96 3.6
24 AA241C 102.5 5 143 4.4
19 AA259L 73.99 5 143.08 2
23 AA260K 79.99 5 143.13 2.6
26 AA277B 84.99 5 143.35 3.1
34 AA28YI 305.99 5 144.51 24.9

42 AA31Y0 189.99 6 139.47 9.1
45 AA32Y9 138.14 6 139.54 5.8
44 AA33R7 129.99 6 140 5.4
46 AA34R4 203.11 6 140.25 10.5
43 AA35A3 99.99 6 140.37 3.5
47 AA36A4 229.99 6 140.38 12.5
48 AA37Q5 341.99 6 140.57 20.5

50 AA40DF 199.99 7 136.44 8.2
52 AA41CC 402.95 7 136.88 19.7
51 AA42VG 279.99 7 137.73 13.5
49 AA43EW 195.33 7 137.97 8.6

我需要的是(我不知道我是否从类别 5 中找到了正确的项目):

ID  Name     Unit Price  Category  Operating Cost   Payback Time

9 AA22VB 64.99 3 146.94 1.9
20 AA228I 88.84 5 142.81 3.2
43 AA35A3 99.99 6 140.37 3.5
50 AA40DF 199.99 7 136.44 8.2

最佳答案

所以这里有几个选项。最直接的选项(也适用于您使用数据库的情况)是按类别分隔所有内容,然后进行排序。 map 对此很有意义,例如:

  • 遍历每个产品并将其放入类别 → 产品的 map 中(例如 Map<Integer,List<Product>> 或例如 Multimap from Guava or whatever - ArrayListMultimap 将特别适合,因为它返回方便修改的值 List您可以直接排序;另一种选择是 TreeMultimap ,它允许您在创建时指定一个值比较器,并且产品将自然地最终排序)。
  • 浏览该 map 中的每个类别,对该类别中的产品列表进行排序(请参阅 Collections.sort 和自定义比较器),从每个列表中提取第一项,这就是您的结果。

您必须有一种方法,使计算出的投资回收时间值可供比较器使用,对此您有几种选择:

  • 只需在每次比较时在比较器中计算投资回收时间即可。
  • 更好的选择:添加 getPaybackTime()方法ABProduct并在那里进行计算。这样,您的计算就位于一个合理的位置,您可以在任何需要的地方访问它们,例如对产品列表进行排序时使用比较器。

Here's a quick and dirty example .

第二个选项是使用您正在使用的任何 O[RM/数据库 API 的查询构建功能,以在 SQL 查询中完成这一切。我不会在这里详细介绍,因为“如何选择组中的最小值”是一个非常常见的问题,有多种技术(例如,请参见SQL: Group by minimum value in one field while selecting distinct rows)。

为您服务的方法是在 SQL 查询本身中进行“投资回收时间”计算数学,并指定您对正在使用的任何 ORM/数据库 API 提出的任何查询(您不这样做) t 指定,并且超出了该答案的范围),请注意您可以使用 SQL 执行类似的操作(由数学组成):

SELECT 
*,
UnitPrice - OperatingCost AS Whatever
FROM
Products

这里的缺点是,现在您已经在 SQL 查询中进行了数学计算,而它可以说是业务功能而不是数据访问功能。为了使这至少在某种程度上易于管理,如果您的数据库支持它( MySQL, for example ),您可能至少需要使用此数学创建一个 View ,并且可能将计算列添加为实体类中的字段。

第二个基于 SQL 的选项可能有点笨拙,所以我只是从第一个业务方方法(按类别分离产品、排序、组装结果)开始。从哲学上讲,无论如何,它可能更合适:这是一个业务级别的操作,在业务方面进行会更干净一些。

这个答案并不完全完整,但希望对您有所帮助。

<小时/>

顺便说一句,对于第一个选项(组织然后排序),您可能真正想做的是向数据层添加一个“类别”实体,假设您有一个类别表,并设置一个适当的一对多的类别与产品关系。

然后你可以有一个dao方法来获取所有类别。这样您就可以查询类别列表,然后遍历每个类别并直接获取该类别中的产品并进行排序(在业务方面)。制作getPaybackTime()产品实体中进行计算的方法也会对您有所帮助。

如果您这样做,您可以跳过划分类别步骤,因为您现在可以直接通过数据层执行此操作。这也会带来一些性能和内存使用方面的好处。

这是我个人选择的实现方式。

关于java - 从结果中识别出 "best bang for the buck"项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42847216/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com