Java ArrayList и HashMap на лету - PullRequest
48 голосов
/ 12 мая 2009

Может кто-нибудь привести пример создания Java ArrayList и HashMap на лету? Таким образом, вместо того, чтобы делать add() или put(), фактически предоставлять начальные данные для массива / хеша при создании экземпляра класса?

Чтобы привести пример, похожий на PHP, например:

$array = array (3, 1, 2);
$assoc_array = array( 'key' => 'value' );

Ответы [ 7 ]

93 голосов
/ 12 мая 2009
List<String> list = new ArrayList<String>() {
 {
    add("value1");
    add("value2");
 }
};

Map<String,String> map = new HashMap<String,String>() {
 {
    put("key1", "value1");
    put("key2", "value2");
 }
};
30 голосов
/ 12 мая 2009

Хороший способ сделать это - использовать Google Collections :

List<String> list = ImmutableList.of("A", "B", "C");

Map<Integer, String> map = ImmutableMap.of(
  1, "A",
  2, "B",
  3, "C");
29 голосов
/ 12 мая 2009

Массивы можно преобразовать в List s:

List<String> al = Arrays.asList("vote", "for", "me"); //pandering

Обратите внимание, что не возвращает ArrayList, а произвольный List экземпляр (в данном случае это Array.ArrayList)!

Подход Бруно работает лучше всего и может рассматриваться на лету для карт. Я предпочитаю другой метод для списков, хотя (видно выше):

Map<String,String> map = new HashMap<String,String>() {
 {
    put("key1", "value1");
    put("key2", "value2");
 }
};
7 голосов
/ 12 мая 2009

для коротких списков:

    List<String> ab = Arrays.asList("a","b");
7 голосов
/ 12 мая 2009

Используйте хороший анонимный инициализатор:

List<String> list = new ArrayList<String>() {{
    add("a");
    add("b");
}};

То же самое относится и к карте:

Map<String, String> map = new HashMap<String, String>() {{
    put("a", "a");
    put("b", "b");
}};

Я считаю это наиболее элегантным и читабельным.

Другие методы требуют сначала создания массива, а затем преобразования его в список - на мой взгляд, слишком дорогой и менее читаемый.

5 голосов
/ 23 мая 2017

Для списков вы можете использовать Arrays.asList , например:

List<String> stringList = Arrays.asList("one", "two");
List<Integer> intList = Arrays.asList(1, 2);

Для Карт вы можете использовать это:

public static <K, V> Map<K, V> mapOf(Object... keyValues) {
    Map<K, V> map = new HashMap<>();

    K key = null;
    for (int index = 0; index < keyValues.length; index++) {
        if (index % 2 == 0) {
            key = (K)keyValues[index];
        }
        else {
            map.put(key, (V)keyValues[index]);
        }
    }

    return map;
}

Map<Integer, String> map1 = mapOf(1, "value1", 2, "value2");
Map<String, String> map2 = mapOf("key1", "value1", "key2", "value2");

Примечание: в Java 9 вы можете использовать Map.of
Примечание 2: Double Brace Initialization для создания HashMaps, как предложено в других ответах, имеет предостережения

3 голосов
/ 12 мая 2009

Вы имеете в виду, как это?

public List<String> buildList(String first, String second)
{
     List<String> ret = new ArrayList<String>();
     ret.add(first);
     ret.add(second);
     return ret;
}

...

List<String> names = buildList("Jon", "Marc");

Или вы заинтересованы в конструкторе ArrayList, который принимает Collection<? extends E>? Например:

String[] items = new String[] { "First", "Second", "Third" };
// Here's one way of creating a List...
Collection<String> itemCollection = Arrays.asList(items);
// And here's another
ArrayList<String> itemList = new ArrayList<String>(itemCollection);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...