在Java中初始化Hashtables?

时间:2012-03-08 21:34:19

标签: java

在C#中,你可以使用这样的代码初始化Hashtables(以及许多其他类型的对象) -

Hashtable table = new Hashtable {{1, 1}, {2, 2}};

在Java中是否有这样的东西,或者您是否必须先声明Hashtable,然后逐个手动将项目放入其中?

10 个答案:

答案 0 :(得分:31)

这在其他地方得到解答,但您可以使用匿名子类:

new HashMap<Integer, Integer>() {{ put(1, 1); put(2, 2); }};
很多锅炉板,但仍然是单线:)。不幸的是,这也会抱怨缺少serialVersionUID常量,你可以添加或忽略警告。

这称为实例初始化程序块,更多信息here

答案 1 :(得分:8)

Google Guava中,如果你想要一个不可变的地图,你可以使用:

Map<K,V> m = ImmutableMap.of(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5);

最多5个键/值对。

除此之外,您可以使用他们的ImmutableMap.Builder课程:

ImmutableMap<String, Integer> WORD_TO_INT = ImmutableMap.builder()
       .put("one", 1)
       .put("two", 2)
       .put("three", 3)
       .build();

仍然不如C#好,但流畅的API有点帮助。

答案 2 :(得分:3)

另一个答案(除了明显的“不 - 没有本地语言方式”):

为了简洁起见,使用带有花式裤子“_”名称的静态工厂方法创建一个Tuple类:

import java.util.Map;
import java.util.HashMap;

class Tuple<T1,T2> {
    private T1 t1;
    private T2 t2;
    public Tuple(T1 t1, T2 t2) {
         this.t1 = t1; this.t2 = t2;
    }
    public T1 getT1() {return t1;}
    public T2 getT2() {return t2;}

    static public <X,Y> Tuple<X,Y> _(X t1, Y t2) { return new Tuple<X,Y>(t1,t2); }
    static public <X,Y> Map<X,Y> mapFor(Tuple<X,Y>... tuples) {
        Map<X,Y> map = new HashMap<X,Y>();
        for( Tuple<X,Y> tuple: tuples ) {
           map.put(tuple.getT1(), tuple.getT2());
        }
        return map;
    }

    public static void main(String[] args) {
        Map<String,Integer> map = Tuple.mapFor( _("A", 1), _("B", 2), _("C",3));
    }
}

如果您想允许制作哪种支持地图的变体,您可以改为传递它:

    static public <X,Y> Map<X,Y> mapFor(Map<X,Y> map, Tuple<X,Y>... tuples) {
        for( Tuple<X,Y> tuple: tuples ) {
           map.put(tuple.getT1(), tuple.getT2());
        }
        return map;
    }

答案 3 :(得分:2)

试试这个:

Hashtable<Integer, String> ht = new Hashtable<Integer, String>(){
    {
        put(1,"One");
        put(2,"Two");
        put(3,"Three");
    }
};

答案 4 :(得分:1)

有一种叫做双支撑初始化的东西,它不太好......

Hashtable table = new Hashtable() {
    {
        table.put(1, 1);
        table.put(2, 2);
    }
};

您甚至可以指定使用匿名数组表示法,然后自己迭代它,如下所示:

Hashtable table = new Hashtable() {
    {
        for (int[] entry : new int[][] { { 1, 1 }, { 2, 2 } }) {
            table.put(entry[0], entry[1]);
        }
    }
};

如果你真的缺少python,也许可以创建一个实用函数:)

答案 5 :(得分:0)

我非常喜欢C#的一个特性就是能够像这样初始化内联。不幸的是,Java没有这个功能。

Java Hashtable没有任何允许这样做的构造函数。请参阅Java API文档中的构造函数列表:

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Hashtable.html

答案 6 :(得分:0)

如果您需要初始化 HashMap (HashTable已过时),您可以使用静态初始化块。

示例:

private static Map<String, String> map;

static {
    map = new HashMap<String, String>();
    map.put("name1", "value1");
    map.put("name2", "value2");
    ....
}

希望这有帮助,玩得开心!

答案 7 :(得分:0)

一种安全的方法是使用Guava中的ImmutableMap.of,如果需要可变性,可以选择用newHashSet包裹:

Maps.newHashMap(ImmutableMap.of(k1, v1, ...));

这是一个用于内联使用的自编写地图构建器,例如: newMap(1, "one", 2, "two", 3, "three")

public static <K, V> Map<K, V> newMap(final K key, final V value, final Object... elements) {
    Preconditions.checkNotNull(key);
    Preconditions.checkArgument(elements.length % 2 == 0, "Array length can't be " + elements.length);

    final HashMap<Object, Object> map = Maps.newHashMap();
    map.put(key, value);
    for (int i = 0; i < elements.length; i += 2) {
        map.put(elements[i], elements[i + 1]);
    }
    return (Map<K, V>) map;
}

答案 8 :(得分:0)

我建议这样的事情:

String[] names={"albert","john","michel"};
int[] id={1234,2345,3456};
Hashtable<int,String> persons = new Hashtable<int,String>();

for(int i=0;i<3;i++)
{
 persons.put(id[i],names[i]);
}

答案 9 :(得分:-1)

这在Java中是不可能的。我们都受此影响。