提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
问题描述
请根据下面定义的商品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类,可以增加类和方法
一、设计思路
- 重写Goods equals 和 hash 方法
- 添加一个新的工具类对 attrList 进行排序
- 使用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 重写的原因,以及对汉字排序时使用特定的比较器进行排序。