将所有项目从HashSet <t>添加到Map <string,t> </string,t> </t>

时间:2013-12-04 19:18:59

标签: java performance collections

我有HashSet<T>个对象要插入Map<String,T>,其中String键是T的属性。最有效的方法是什么?我猜有一种比我目前更好的方式:

Map<String,T> myMap = new HashMap<String,T>();
HashSet<T> mySet = new LinkedHashSet<T>();

... Add some T's to mySet

for(T t : mySet){
    myMap.put(t.getObjectKey(), t);
} 

3 个答案:

答案 0 :(得分:5)

您可以使用lambda expressions在Java 8中实现此目的:

Map<String, T> myMap =  mySet.stream()
                             .collect(Collectors.toMap(x -> x.getObjectKey(),x -> x));

其中T是对象的类型,并假设x.getObjectKey()返回String

演示here

答案 1 :(得分:1)

Guava库允许您使用更多功能风格的方式来粗略地表达您正在做的事情,但它不会更高效,并且使用Java编程语言的当前状态它不会特别非常漂亮。

直到我们在Java 8中获得lambda表达式,你几乎完全不知道你做了什么。

答案 2 :(得分:0)

回答有点迟,我会回答:如果我需要这样的选项,我会根据OOP传统为自己设计一个自定义HashMap:允许任何类型的{{1}类型CollectionSet

  1. 要在List中映射为(键,值)对条目的Object类应该具有返回类型为HashMap<K, V>的函数getRelationalKey()。因此,我们需要将对象类标记为强制实现的类型Relational。我们将使用界面的帮助:

    K
  2. interface Relational<T> { public T getRelationalKey(); } 应该有一个函数HashMap<K, V>,可以将集合的所有此类对象放入putAllFromRCollection(Collection)。因此,带签名的函数声明应该类似于:Map。因此,自定义putAllFromRCollection(Collection<? extends Relational<K>> collectionHashMap可以具有以下实现:

    MyHashMap
  3. 现在是测试用例的时候了:让我们宣布一个类:

    class MyHashMap<K, V> extends HashMap<K, V>
    {
    
        public void putAllFromRCollection(Collection<? extends Relational<K>> collection)
        {
            for(Relational<K> relObj: collection)
            {
                put(relObj.getRelationalKey(), (V)relObj);
            }
       }
    
    }
    

    并将此类的一些对象添加到class ATestClass implements Relational<String> { public String name; public String address; public ATestClass(String name, String address) { this.name = name; this.address = address; } @Override public String getRelationalKey() { return name;// or address or whatever should be regarded as a key } }

    HashSet

    <强>输出:

    HashSet<ATestClass>testSet = new HashSet<>();
    testSet.add(new ATestClass("AName", "A-Adress"));
    testSet.add(new ATestClass("BName", "B-Adress"));
    testSet.add(new ATestClass("CName", "C-Adress"));
    testSet.add(new ATestClass("DName", "D-Adress"));
    
    MyHashMap<String, ATestClass>myMap = new MyHashMap<>();
    myMap.putAllFromRCollection(testSet);
    
    System.out.println(myMap);
    

    优点是:

    • 我们现在可以定义密钥的所需数据类型以与对象建立关系
    • 将Class的特定目标字段设置为{ CName=CollectionsTest.ATestClass@c21495, BName=CollectionsTest.ATestClass@14b7453, DName=CollectionsTest.ATestClass@1d5550d, AName=CollectionsTest.ATestClass@1186fab } 'S键的Key匹配类型
    • 允许任何类型的HashMap,而不仅仅是Collection<E>

    但是,在此实现中,我避免使用提供的HashSet大小来提供用于调整地图大小的代码,以实现性能。有关详细信息,请参阅Collection函数的来源。