美团 java面试程序设计题 面试题笔记 Goods 合并 并重新计算count

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

问题描述
请根据下面定义的商品Class,设计程序能够合并名称与属性完全相同的商品。

class Goods {
/**商品名称 *
String name
./** 商品属性 *
List(String) attrList
/** 商品数量”
Integer count;
}
class MergeUtil {
static List mergeGoods(List goodsList){
//todo
return null;
}
}

示例:
【合并前】的商品:
红富士,[红色,纯天然,很甜],10个
红富士,[很甜,红色,纯天然],2个
红富士,[纯天然,红色],5个
小金苹果,[纯天然,红色],20个
【合并后】的商品:
红富士,[红色,纯天然,很甜],12个
红富士,[纯天然,红色],5个
小金苹果,[纯天然,红色],20个
提示:可以修改Goods类,可以增加类和方法


一、设计思路

  1. 重写Goods equals 和 hash 方法
  2. 添加一个新的工具类对 attrList 进行排序
  3. 使用map进行存储合并后的值

二、关键点

重写equals 和hash 是因为把Goods 的name 和 attrList 作为 Map 的 Key
实用 List 的 sort 方法排列时使用 如下 比较器比较汉字

  Collator collator = Collator.getInstance(Locale.CHINA);
  collator.compare(o1,o2)

三、代码实现

Goods 类

public class Goods {
    @Override
    public String toString() {
        return "Goods{" +
                "name='" + name + '\'' +
                ", attrList=" + attrList +
                ", count=" + count +
                '}';
    }

    public Goods(String name, List<String> attrList, Integer count) {
        this.name = name;
        this.attrList = attrList;
        this.count = count;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Goods goods = (Goods) o;
        return Objects.equals(name, goods.name) && Objects.equals(attrList, goods.attrList);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, attrList);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<String> getAttrList() {
        return attrList;
    }

    public void setAttrList(List<String> attrList) {
        this.attrList = attrList;
    }

    public Integer getCount() {
        return count;
    }

    public void setCount(Integer count) {
        this.count = count;
    }

    private String name;
    private List<String> attrList;
    private Integer count;

MergeUtil 工具类

public  static List mergeUtil(List<Goods> list) {
        List sortedList = sort(list);
        Map<String,Goods> map = new HashMap<>();
        for (Object o : sortedList) {
            Goods goods = (Goods) o;
            String string = goods.getAttrList().toString();
            String key = goods.getName()+ string;
            if (map.containsKey(key)){
                Goods goods1 = map.get(key);
                Integer count = goods1.getCount();
                Integer count1 = goods.getCount();
                goods.setCount(count + count1);
                map.put(key,goods);
            }else {
                map.put(key,goods);
            }
        }
        return new ArrayList(map.values());
    }


    public static List sort(List<Goods> list){
        List<Goods> temp  = new ArrayList<>();
        for (Goods goods : list) {
            List<String> attrList = goods.getAttrList();
		//  Arrays.sort(attrList.toArray());
            attrList.sort(new Comparator<String>() {
                @Override
                public int compare(String o1, String o2) {
                    Collator collator = Collator.getInstance(Locale.CHINA);
                    return collator.compare(o1,o2);
                }
            });
            goods.setAttrList(attrList);
            temp.add(goods);
        }
        return temp;
    }

总结

代码还不是很精简,也有别的思路,比如:直接 使用 if 判断 name和 attrList是否相等去重算count;经过这次代码编写 主要收获是了解Map的equals 和hash 重写的原因,以及对汉字排序时使用特定的比较器进行排序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值