gpt4 book ai didi

java - 根据某些规则过滤集合的最佳方法

转载 作者:行者123 更新时间:2023-12-01 13:51:04 25 4
gpt4 key购买 nike

我正在尝试找到一种根据某些规则从列表中过滤掉某些项目的最佳方法。例如我们有

public class Person{
String name;
String sex;
String dob;
String contactNo;
Person(String name, String sex, String dob, String contactNo) {
this.name = name;
this.sex = sex;
this.dob = dob;
this.contactNo = contactNo;
}
}

List<Person> persons = Arrays.asList(new Person("Bob", "male", "19800101", "12345"),
new Person("John", "male", "19810101", "12345"),
new Person("Tom", "male", "19820101", "12345"),
new Person("Helen", "female", "19800101", "12345"),
new Person("Jack", "male", "19830101", "12345"),
new Person("Suan", "female", "19850101", "12345"));

我想删除一对具有相同 dob 和 contactNo 的男性和女性(删除上面示例中的 Bob 和 Helen)。我使用嵌套循环实现了如下所示,该循环有效但看起来很丑。请问有更好的方法可以实现这一点吗?我可以实现谓词来做到这一点吗?

public void filterPersons() {       
List<Person> filtered = new ArrayList<Person>();

for (Person p: persons) {
boolean pairFound = false;
for (Person t: persons) {
if ((p.sex.equals("male") && t.sex.equals("female")) || (p.sex.equals("female") && t.sex.equals("male"))) {
if (p.dob.equals(t.dob) && p.contactNo.equals(t.contactNo)) {
pairFound = true;
break;
}
}
}
if (!pairFound) {filtered.add(p);}
}

System.out.println("filtered size is: " + filtered.size());
for (Person p: filtered) {
System.out.println(p.name);
}
}

非常感谢。

我重写了上面的方法,如下所示,看起来更好:

public void testFilter() {      
Predicate<Person> isPairFound = new Predicate<Person>() {
@Override public boolean apply(Person p) {
boolean pairFound = false;
for (Person t: persons) {
if ((p.sex.equals("male") && t.sex.equals("female")) ||
(p.sex.equals("female") && t.sex.equals("male"))) {
if (p.dob.equals(t.dob) && p.contactNo.equals(t.contactNo)) {
pairFound = true;
break;
}
}
}
return pairFound;
}
};

Iterable<Person> filtered = Iterables.filter(persons, isPairFound);
for (Person p: filtered) {
System.out.println(p.name);
}
}

最佳答案

我不认为嵌套的 for 循环特别难看。您正在根据有效的任意标准寻找列表中项目之间的匹配项,因此您需要将每个条目与其他条目进行比较。

您可以考虑的一项改进是将迭代代码与比较逻辑分开。这就是您使用谓词的方向。为此,您需要一个带有两个对象而不是一个对象的谓词。

public interface PredicateComparator<T> {
boolean compare(T o1, T o2);
}

您的代码现在看起来像这样

public void filterPersons() {

PredicateComparator<Person> predicate = new PredicateComparator<Person>() {
public boolean compare(Person o1, Person o2) {
// comparison logic in here
}

};

List<Person> filtered = new ArrayList<Person>();
for (Person p : persons) {
for (Person t : persons) {
if (predicate.compare(p, t)) {
filtered.add(p);
}
}
}

System.out.println("filtered size is: " + filtered.size());
for (Person p: filtered) {
System.out.println(p.name);
}
}

关于java - 根据某些规则过滤集合的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19947758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com