原始需求如下:根据一个json数组中的元素的特定属性去重。
例如:"[{"plateNumber":"京A00001","model":"tesla90","color":"black"},{"plateNumber":"京A00001","model":"tesla90","color":"black"},{"plateNumber":"京A00001","model":"tesla90","color":"red"}]"
假设我们认为plateNumber相同的元素具有等价性,那么如上json数组可以去重为:[{"plateNumber":"京A00001","model":"tesla90","color":"black"}]
例如:"[{"plateNumber":"京A00001","model":"tesla90","color":"black"},{"plateNumber":"京A00001","model":"tesla90","color":"black"},{"plateNumber":"京A00001","model":"tesla90","color":"red"}]"
假设我们认为plateNumber相同的元素具有等价性,那么如上json数组可以去重为:[{"plateNumber":"京A00001","model":"tesla90","color":"black"}]
思路是将一个json数组映射为List<Entity>,利用Set<Entity>本身的特性去重;所以我们需要对Entity覆盖HashCode和Equals方法,为了最小化最实体对象的侵入,并将该去重作为一个通用组件使用,有如下的设计。
注:按照这个设计思路,去重时具体选择保留哪个元素是不确定且无法指定的,算是这个思路的缺陷。有新的想法,欢迎交流探讨。
1.设计一个接口,用来设置去重的依据属性。
public interface Reducible {
void setType(String...type);
}
2.为了减少在覆盖HashCode和Equals时对实体类的侵入,我们设计一个抽象类(实现Reducible),来负责记录去重的字段名称,同时覆盖HashCode和Equals方法。如果不指定去重的依据属性,则按照全部属性去重。
public abstract class ReduceAbstract implements Reducible {
private String[] typeArray;
@Ov