问题:
人脸识别返回一个识别集合,元素包含三个字段trackId,face,name。
每条数据均有trackId,且有可能会重复;不一定有name和face。
我们认为同一个trackId的条目 均为重复信息,需求是 去除重复trackId,并保证保留下的那条信息最全,优先考虑name。
源数据形式如下:
遇到这种问题,建议在Person中加一个字段来标识自己的信息完整性,
/**
* Created by ylWang on 2018/7/7 17:28.
*/
public class Person {
private int trackId;
private String face = "";
private String name = "";
private int priority;//用于标识数据完整性,以确定优先级
public int getPriority() {
return priority;
}
public static boolean isEmpty(CharSequence str) {
return str == null || str.length() == 0;
}
public int getTrackId() {
return trackId;
}
public void setTrackId(int trackId) {
this.trackId = trackId;
}
public String getFace() {
return face == null ? "" : face;
}
public void setFace(String face) {
if (!isEmpty(face)) priority += 1;
this.face = face;
}
public void setName(String name) {
if (!isEmpty(name)) priority += 2;
this.name = name;
}
public String getName() {
return name == null ? "" : name;
}
}
/**
* @param srcList 源数据,带有重复的trackId的person集合
* @return 去重复后的person集合
*/
private List<Person> getSmartList(List<Person> srcList) {
List<Integer> idList = new ArrayList<>();//存储不重复的trackId
List<Person> desList = new ArrayList<>();//存储不重复的Person
for (Person person : srcList) {
int trackId = person.getTrackId();
int idIndex = idList.indexOf(trackId);
if (idIndex < 0) {//新的trackId先添加到集合里
idList.add(trackId);
desList.add(person);
} else {//比较同一个trackId中,数据的完整性,进行替换
if (person.getPriority() > desList.get(idIndex).getPriority()) {
desList.remove(idIndex);
if (idIndex > desList.size() - 1)
desList.add(person);//末尾追加
else
desList.add(idIndex, person);
}
}
}
return desList;
}
去重效果如下: