人脸信息集合去重

问题:

人脸识别返回一个识别集合,元素包含三个字段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;
}

 

去重效果如下:

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值