合并托盘

现已定义好托盘(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;
}

results matching ""

    No results matching ""