java.util.Set.addAll()方法中的问题

时间:2010-04-16 12:36:48

标签: java set

我有java.util.Set<City> cities,我需要通过两种方式将城市添加到此集:

  • 添加个别城市(借助cities.add(city)方法调用)

  • 在此套装中添加另一组城市(借助cities.addAll(anotherCitiesSet)方法调用)

但第二种方法的问题是我不知道anotherCitiesSet中是否有任何重复的城市。

我想在尝试在cities集中输入重复条目时进行一些处理。

6 个答案:

答案 0 :(得分:10)

复制cities集(比如citiesCopy),然后调用citiesCopy.retainAll(anotherCitiesSet) - citiesCopy中的结果集将包含两个集的交集,因此允许您轻松查看哪些城市是重复的,如果有的话。

或者,遍历第二组并手动添加每个元素,每次检查add()的返回值:

for(java.util.Set<City> c : anotherCitiesSet) {
    if(!cities.add(c)) {
        // c was a duplicate, do something?
    }
}

答案 1 :(得分:2)

从java.util.Set派生一个类,如果可能,覆盖addAll(如果可能,创建新方法)并逐个添加项目,并在检测到重复条目时进行自定义处理。

答案 2 :(得分:1)

在致电addAll之前,您需要检查重复项:

Set<City> cities = getCities();
Set<City> otherCities = getOtherSetOfCities();
Set<City> duplicates = new HashSet<City>(otherCities);
duplicates.retainAll(cities);
// now duplicates contains all City objects that are in otherCities and cities

答案 3 :(得分:1)

是你的城市只是字符串(这是对象) 或者它是包含其他东西的对象?

  • 如果是String,那么我猜上面的答案就可以了。

  • 如果是包含以下内容的对象:String name,int population等... 并且您只想比较String name以删除重复项,然后您可以使用{HashSet}类并覆盖其(HashCode)和(equals)方法。

因为你可能有两个城市:纽约市和另一个纽约市。包含相同的信息。但因为它们是堆中的两个对象。他们会有不同的HashCode。也就是说,你的HashSet将保留它们。 HashSet检查HashCode和含义equals()。

解决方案是覆盖两种方法:

Auth Id  Application    Appl.      Application Id                                                 DB       # of
        Name           Handle                                                                    Name    Agents
-------- -------------- ---------- -------------------------------------------------------------- -------- -----
DB2TEST  python         47         127.0.0.1.34218.180529224354                                   SAMPLE   1

答案 4 :(得分:0)

cities.addAll()之前:

Set<City> intersection = new HashSet<City>(cities);
cities.retainAll(anotherCitiesSet);

// Process all the items in the intersection, these are your duplicates
...

cities.addAll(anotherCitiesSet);

答案 5 :(得分:0)

我认为最优雅的解决方案是使用java.util.Set的实现, 例如java.util.HashSet。 例如,以下代码将集合d中的所有整数添加到集合c中, 未添加重复项

代码:

import java.util.HashSet;
import java.util.LinkedList;

import com.google.common.base.Joiner;

public class CollectionsTest {

    public static void main(String[] args) {
        HashSet<Integer> c = new HashSet<>();
        c.add(0);
        c.add(1);
        c.add(2);

        HashSet<Integer> d = new HashSet<>();
        d.add(2);
        d.add(3);

        System.out.println("c = " + Joiner.on(", ").join(c));
        System.out.println("d = " + Joiner.on(", ").join(d));
        c.addAll(d);
        System.out.println("c.addAll(d) = " + Joiner.on(", ").join(c));

    }

}

输出:

c = 0, 1, 2
d = 2, 3
c.addAll(d) = 0, 1, 2, 3

为了让HashSet能够正常使用City个对象, City异议应覆盖hashCode()equals()方法。 然后HashSet会在免费使用addAll()时删除重复项!