微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在列表中进行迭代时,将一个或多个匹配项组合在一起

如何解决在列表中进行迭代时,将一个或多个匹配项组合在一起

如果我需要遍历列表并尝试将元素分组在一起,那么最好的方法是什么?

例如,我们有以下对象要循环通过:

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 举报,一经查实,本站将立刻删除。