删除列表中的一些重复项

Remove some repeated items in a List

我正在使用 java 个这样的对象:

public class GeoName {
   private String country;
   private String city;
   private float lat;
   private float lon;
}

我收到一份 GeoName 列表,我想尽可能高效地删除列表中同一国家/地区的重复城市。我的意思是,如果我收到以下列表:

Madrid, Spain, ...
London, England, ...
Madrid, Mexico, ...
London, England, ...
Paris, France, ...
Madrid, Spain, ...

我想删除重复的项目(城市+国家)直到列表是这样的:

Madrid, Spain, ...
London, England, ...
Madrid, Mexico, ...
Paris, France, ...

我正在努力,但我不知道该怎么做!

有什么想法吗?

谢谢!

PS:我不能使用Set集合,因为我发现一个城市的名称在不同经纬度的国家重复(这很奇怪,但它们存在)。所以它不会是 Set

上完全相等的项目

您可以为 GeoName 实施仅考虑国家和城市的 hashCode() 和 equals()。

@Override
public boolean equals(Object o) {
    if (this == o)
        return true;
    if (o == null || getClass() != o.getClass())
        return false;

    GeoName geoName = (GeoName) o;

    if (!country.equals(geoName.country))
        return false;
    return city.equals(geoName.city);
}

@Override
public int hashCode() {
    int result = country.hashCode();
    result = 31 * result + city.hashCode();
    return result;
}

之后,您可以使用 HashSet() 将所有 GeoName 放入其中。重复项将自动高效地整理出来。

    List<GeoName> myInputList = ...;
    Set<GeoName> geoSet = new HashSet<>(myInputList);

应该这样做:

我用修改后的 .equals 方法创建了你的 class,然后使用所述 .equals 方法检查 class 的 2 个测试实例是否相同。

class GeoName {
   private String country;
   private String city;

   public GeoName(String country, String city) {
       this.country = country;
       this.city = city;
   }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final GeoName other = (GeoName) obj;
        if (!Objects.equals(this.country, other.country)) {
            return false;
        }
        if (!Objects.equals(this.city, other.city)) {
            return false;
        }
        return true;
    }
}

测试class:

public class Cities {
    public static void main(String[] args) {
          // ArrayList<GeoName> geos = new ArrayList<>(); 

          GeoName test = new GeoName("Madrid", "Spain");
          GeoName test1 = new GeoName("Madrid", "Mexico");

            if (test.equals(test)) {
                System.out.println("True 1");
            }

            if (test.equals(test1)) {
                System.out.println("True 2");
            }
    }
}

输出:

True 1

然后你将遍历数组并检查所有数组,如果不存在则将其添加到数组中,我把它留给你。

这是一个完整的例子:

import java.util.HashSet;
import java.util.Objects;
import java.util.Set;

public class GeoName {
   private String country, city;
   private float lat, lon;

   public GeoName(String country, String city, float lat, float lon){
       this.country = country;
       this.city = city;
       this.lat = lat;
       this.lon = lon;
   }

   @Override
   public boolean equals(Object other){
      if(other==null) return false;
      if(other instanceof GeoName){
        return ((GeoName)other).city.equals(this.city) &&
               ((GeoName)other).country.equals(this.country);
      }
      return false;   
    }

    @Override
    public String toString(){
        return city + ", "+ country +
               ", " + lat +", " + lon;
    }


    @Override
    public int hashCode(){
       return Objects.hash(country, city);

    }

    // to test
    public static void main(String[] args) {
        List<GeoName> list = new ArrayList<>();

        list.add(new GeoName("Madrid", "Spain",1.0f, 2.0f));
        list.add(new GeoName("England", "London",3.0f, 4.0f));
        list.add(new GeoName("England", "London",3.0f, 4.0f));
        list.add(new GeoName("France", "Paris",7.0f, 9.0f));
        list.add(new GeoName("Mexico", "Madrid",9.0f, 10.0f));

        Set<GeoName> set = new HashSet<>(list);

        for(GeoName geoName : set){
            System.out.println(geoName);
        }          
    }    
}

输出:

London, England, 3.0, 4.0
Madrid, Mexico, 9.0, 10.0
Paris, France, 7.0, 9.0
Spain, Madrid, 1.0, 2.0

要从自定义数据集合(例如 GeoName )中删除重复条目,请实施 equals() 和 hashcode() 方法。

然后将数据添加到 Set 中以删除重复条目。

根据您的逻辑实现 equals() 和 hashcode() 以识别重复数据。