我有一个List
人员,我想查找重复的条目,以约束除以外的所有字段id
。因此,请使用equals()
-method(并因此使用List.contains()
),因为它们已考虑id
在内。
public class Person {
private String firstname, lastname;
private int age;
private long id;
}
修改equals()
和hashCode()
方法以忽略该id
字段不是一种选择,因为代码的其他部分依赖于此。
如果我想忽略该id
字段,Java中最有效的方法是对重复项进行分类?
构建一个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);
问题内容: 询问 有时无法找到小写和大写之间的重复项。 例如:并且不显示为重复项。 因此,如何在PostgreSQL中找到两列的所有可能重复项。 问题答案: [](http://www.postgresql.org/docs/current/interactive/functions- string.html#FUNCTIONS-STRING-SQL)/ 使用其中之一将字符折叠为小写或大写。特殊字
它有时无法在小写和大写之间找到重复项。 例如:和不显示为重复项。 那么如何在PostgreSQL中为两列找到所有可能的重复项。
知道我做错了什么吗?如果重要的话,我将使用Jackson-core 2.1.1。
我正在尝试用空格替换引号中的管道分隔字符。问题是我有很多误报,因为有些字符串为空。我只想在引号之间有文本时替换管道。我使用的正则表达式模式来自另一个stackoverflow帖子,因为我缺乏正则表达式技能。 数据样本: 我使用的代码: 它很好地取代了“蓝绿色”管道。但它也替换了引号之间的管道,这会在列被删除时破坏文件。 用我正在处理的文件的实际样本更新了代码。正则表达式找到了它,但没有替换管道。遗
我很难让Chrome注意到布局中的flex-basis部分。它在布局中运行良好。 下面的代码片段演示了这个问题:黄色、蓝色和粉红色的条是基于flex的50px、25%和75%,显示在列和行flex方向上。 如果您在Firefox(或IE11或Edge)中运行,那么列和行都按预期划分区域: 左和右之间的唯一区别是。 我尝试将添加到中,这使Chrome注意到flex的基础,但却引起了一个不同的问题--