合并托盘
现已定义好托盘(class Tray)、商品(Goods)的结构,其中一个托盘可以包含1个或多个商品,商品由ID、数量组成。 请将相同的托盘(托盘ID相等),同一个托盘内,请将相同的商品合并(商品ID相等时,数量相加)。 例如现有结构 Tray_0: (Goods_1, 2), (Goods_2, 1), Tray_1: (Goods_2, 2), Tray_0: (Goods_1, 1), (Goods_3, 1),
调用result = mergeTrays(trays);方法后,合并后的结果放入result对象,结果应当为 Tray_0: (Goods_1, 3), (Goods_2, 1), (Goods_3, 1), Tray_1: (Goods_2, 2),
请补充MergeTrays类中的mergeTrays方法(在TODO注释中),实现相同托盘及相同商品的合并。
注意:合并后的托盘顺序不重要,商品顺序不重要,保证商品种类、数量正确即可。
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class MergeTrays {
static class Tray {
int id;
List<Goods> goods;
}
static class Goods {
int id;
int count;
}
private static final int MAX_TRAYS = 10;
private static final int MAX_TRAY_ID = 6;
private static final int MAX_GOODS = 3;
private static final int MAX_GOODS_ID = 10;
private static final int MAX_GOODS_COUNT = 3;
public static void main(String[] args) {
List<Tray> trays = genTrays();
printTrays("原始数据", trays);
List<Tray> result = mergeTrays(trays);
printTrays("处理结果", result);
}
private static List<Tray> genTrays() {
List<Tray> trays = new ArrayList<>();
for (int i = 0; i < MAX_TRAYS; ++i) {
Tray tray = genTray();
trays.add(tray);
}
return trays;
}
private static Random rnd = new Random();
private static Tray genTray() {
Tray tray = new Tray();
tray.id = rnd.nextInt(MAX_TRAY_ID);
tray.goods = genGoods();
return tray;
}
private static List<Goods> genGoods() {
List<Goods> result = new ArrayList<>();
int goodsSize = rnd.nextInt(MAX_GOODS) + 1;
for (int i = 0; i < goodsSize; ++i) {
Goods g = new Goods();
g.id = rnd.nextInt(MAX_GOODS_ID);
g.count = rnd.nextInt(MAX_GOODS_COUNT) + 1;
result.add(g);
}
return result;
}
private static void printTrays(String title, List<Tray> list) {
System.out.println(title);
for (Tray t : list) {
if (t == null)
continue;
System.out.print("\tTray_" + t.id + ": ");
if (t.goods != null) {
for (Goods g : t.goods) {
if (g == null)
continue;
System.out.print("(Goods_" + g.id + ", " + g.count + "), ");
}
}
System.out.println();
}
System.out.println();
}
private static List<Tray> mergeTrays(List<Tray> list) {
// TODO 请补充代码
return list;
}
}
参考解答
private static List<Tray> mergeTrays(List<Tray> list) {
// 合并托盘
Map<Integer, Tray> map = new HashMap<>();
for (Tray tray : list) {
Tray mergeTray = map.get(tray.id);
if (mergeTray == null) {
map.put(tray.id, tray);
} else {
mergeTray.goods.addAll(tray.goods);
}
}
List<Tray> mergeList = new ArrayList<>();
mergeList.addAll(map.values());
// 合并每个托盘的商品
for (Tray tray : mergeList) {
Map<Integer, Goods> gm = new HashMap<>();
for (Goods good : tray.goods) {
Goods mergeGood = gm.get(good.id);
if (mergeGood == null) {
gm.put(good.id, good);
} else
mergeGood.count += good.count;
}
tray.goods.clear();
tray.goods.addAll(gm.values());
}
return mergeList;
}