栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在忽略字段的列表中查找重复项

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在忽略字段的列表中查找重复项

构建一个

Comparator<Person>
以实现您的自然键排序,然后使用基于二进制搜索的重复数据删除。
TreeSet
即可为您提供这种能力。

请注意,

Comparator<T>.compare(a,b)
必须满足通常的反对称性,传递性,一致性和反射性要求,否则二进制搜索顺序将失败。您还应该使它感知空值(例如,一个,另一个或两者的名字段为空)。

您的Person类的一个简单的自然键比较器如下(它是静态成员类,如果每个字段都有访问器,则没有显示)。

public class Person {    public static class NkComparator implements Comparator<Person>    {        public int compare(Person p1, Person p2)        { if (p1 == null || p2 == null) throw new NullPointerException(); if (p1 == p2) return 0; int i = nullSafeCompareTo(p1.firstname, p2.firstname); if (i != 0) return i; i = nullSafeCompareTo(p1.lastname, p2.lastname); if (i != 0) return i; return p1.age - p2.age;        }        private static int nullSafeCompareTo(String s1, String s2)        { return (s1 == null)         ? (s2 == null) ? 0 : -1         : (s2 == null) ? 1 : s1.compareTo(s2);        }    }    private String firstname, lastname;    private int age;    private long id;}

然后,您可以使用它来生成唯一列表。使用仅当元素在集合中不存在时才

add
返回的方法
true

List<Person> newList = new ArrayList<Person>();TreeSet<Person> nkIndex = new TreeSet<Person>(new Person.NkComparator());for (Person p : originalList)    if (nkIndex.add(p)) newList.add(p); // to generate a unique list

或交换该行的最后一行以输出重复项

    if (nkIndex.add(p)) newList.add(p);

无论您做什么,都不要

remove
在枚举原始列表时使用它,这就是为什么这些方法将您的独特元素添加到新列表中的原因。

如果您只对唯一列表感兴趣,并希望使用尽可能少的行:

TreeSet<Person> set = new TreeSet<Person>(new Person.NkComparator());set.addAll(originalList);List<Person> newList = new ArrayList<Person>(set);


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/516224.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号