如何解决在列表中进行迭代时,将一个或多个匹配项组合在一起
如果我需要遍历列表并尝试将元素分组在一起,那么最好的方法是什么?
例如,我们有以下对象要循环通过:
People
|---Person
| -FirstName: Jimmy
| -LastName: Ward
| -Address1: 1 Main Street
| -Town: Yipee
| -Country: Canada
| -Postcode: ABC
|---Person
| -FirstName: Johnny
| -LastName: Jones
| -Address1: 21 Jump Street
| -Town: Sometownie
| -Country: Ireland
| -Postcode: ZZZ
|---Person
| -FirstName: Vinny
| -LastName: McWhinney
| -Address1: 11 Blah Lane
| -Town: Pastaville
| -Country: Italy
| -Postcode: ALO
|---Person
| -FirstName: Tommy
| -LastName: Jones
| -Address1: 21 Jump Street
| -Town: Sometownie
| -Country: Ireland
| -Postcode: ZZZ
|---Person
| -FirstName: Wendy
| -LastName: Ward
| -Address1: 1 Main Street
| -Town: Yipee
| -Country: Canada
| -Postcode: ABC
|---Person
| -FirstName: Jenny
| -LastName: Bloggs
| -Address1: 1 Yadda Road
| -Town: Blahdeblah
| -Country: Ireland
| -Postcode: XYZ
我需要遍历每个人,并创建一个由具有相同地址和相同姓氏的人组成的小组。
例如,它以Jimmy开头,遍历列表以查找具有相同地址和姓氏的任何人,只有Wendy匹配,因此他们都被分组在一起。接下来是约翰尼,汤米是唯一的对手。
遍历列表中的其余人员时,我们不想对Wendy或Tommy进行相同的处理(因为他们已经分组)。因此,我们需要从原始列表中删除匹配的内容,或者以某种方式插入地图?
我在想一个while循环,然后在for循环中查找任何匹配项。免责声明:此提议的解决方案用于删除那些匹配项,因此可能与预期不符。
例如:
while (!originalPersonList.isEmpty()) {
ArrayList<Person> newGroup = new ArrayList<Integer>();
List<Integer> indexToRemove = new ArrayList<Integer>();
newGroup.add(0);
indexToRemove.add(0);
for (int i=1; i < originalPersonList.size(); i++) {
if (originalPersonList.get(0).Address1().equals( originalPersonList.get(i).Address1())
&& originalPersonList.get(0).Town().equals(originalPersonList.get(i).Town())
&& originalPersonList.get(0).Country().equals( originalPersonList.get(i).Country())
&& originalPersonList.get(0).Postcode().equals( originalPersonList.get(i).Postcode()
&& originalPersonList.get(0).Lastname().equals( originalPersonList.get(i).Lastname())
{
indexToRemove.add(i);
newGroup.add(i);
}
}
originalPersonList.removeAll(indexToRemove);
}
这就是我要去的方向,但是我觉得那里可能会有一个更优雅的解决方案?
我只能使用Java7。
解决方法
正如@HernánAlarcón所说,Map是您所要求的一个很好的用例场景。因此,让我们逐步进行:
创建个人POJO
listings
地图需要一个具有正确的哈希码/等于实现的键类。因此,让我们创建一个包含所需条件的类:
PersonProjection
public class Person {
private String firstName;
private String lastName;
private String address;
private String town;
private String country;
private String postCode;
//Constructor,Getters,Setters ommited for clarity
}
下面是可以正确地与Java 7兼容的主要代码(8+比这更简单):
public class PersonProjection {
private String lastname;
private String address;
public PersonProjection(String lastname,String address) {
this.lastname = lastname;
this.address = address;
}
public String getLastname() {
return lastname;
}
public String getAddress() {
return address;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
PersonProjection that = (PersonProjection) o;
return Objects.equals(lastname,that.lastname) &&
Objects.equals(address,that.address);
}
@Override
public int hashCode() {
return Objects.hash(lastname,address);
}
}
请注意,此代码未经测试。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。