java软件开发面试题

题目2:合并托盘
现已定义好托盘(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;
}
}
各位大神怎么破呢

List<Tray> list2 = new ArrayList<Tray>();
for (Tray tray : list) {
// 合并自身商品 id 相同的托盘上的商品

List<Goods> gList0 = new ArrayList<Goods>();
for (Goods good : tray.goods) {
boolean flag = false;
for (Goods g0 : gList0) {
if (g0.id == good.id) {
g0.count += good.count;
flag = true;
}
}
if (!flag) {
gList0.add(good);
}
}
tray.goods = gList0;

// 合并托盘id 相同 的的商品
Tray t0 = null;
for (Tray tray2 : list2) {
if (tray2.id == tray.id) {
t0 = tray2;
break;
}
}
if (t0 == null) {
list2.add(tray);
} else {
for (Goods good : tray.goods) {
boolean flag = false;
for (Goods g0 : t0.goods) {
if (g0.id == good.id) {
g0.count += good.count;
flag = true;
}
}
if (!flag) {
t0.goods.add(good);
}
flag = false;
}
}
t0 = null;
}
list = list2;

温馨提示:答案为网友推荐,仅供参考
相似回答