Hashmap не возвращает все значения [duplicate]

Вместо этого вы можете передать его с помощью extra-vars .

Просто сделайте раздел hosts переменной, например {{ hosts_prompt }}, а затем передайте хост в командной строке например:

ansible-playbook -i inventory/environment playbook.yml --extra-vars "hosts_prompt=192.168.1.10"

Или, если вы используете местоположение файла инвентаря по умолчанию в /etc/ansible/hosts, вы можете просто использовать:

ansible-playbook playbook.yml --extra-vars "hosts_prompt=192.168.1.10"

160
задан Bozho 10 February 2011 в 13:17
поделиться

19 ответов

Вы можете:

  1. Использовать карту, которая имеет список в качестве значения. Map<KeyType, List<ValueType>>.
  2. Создайте новый класс-оболочку и поместите экземпляры этой обертки на карту. Map<KeyType, WrapperType>.
  3. Используйте класс, подобный кортежу (сохраняет создание множества оболочек). Map<KeyType, Tuple<Value1Type, Value2Type>>.
  4. Используйте параллельные карты бок о бок.

Примеры

1. Карта со списком как значение

// create our map
Map<string, List<Person>> peopleByForename = new HashMap<string, List<Person>>();    

// populate it
List<Person> people = new ArrayList<Person>();
people.add(new Person("Bob Smith"));
people.add(new Person("Bob Jones"));
peopleByForename.put("Bob", people);

// read from it
List<Person> bobs = peopleByForename["Bob"];
Person bob1 = bobs[0];
Person bob2 = bobs[1];

Недостатком такого подхода является то, что список не привязан к точно двум значениям.

2. Использование класса-оболочки

// define our wrapper
class Wrapper {
    public Wrapper(Person person1, Person person2) {
       this.person1 = person1;
       this.person2 = person2;
    }

    public Person getPerson1 { return this.person1; }
    public Person getPerson2 { return this.person2; }

    private Person person1;
    private Person person2;
}

// create our map
Map<string, Wrapper> peopleByForename = new HashMap<string, Wrapper>();

// populate it
Wrapper people = new Wrapper()
peopleByForename.put("Bob", new Wrapper(new Person("Bob Smith"),
                                        new Person("Bob Jones"));

// read from it
Wrapper bobs = peopleByForename["Bob"];
Person bob1 = bobs.Person1;
Person bob2 = bobs.Person2;

Недостатком такого подхода является то, что вам нужно написать много кода котельной для всех этих очень простых классов контейнеров.

3. Использование кортежа

// you'll have to write or download a Tuple class in Java, (.NET ships with one)

// create our map
Map<string, Tuple2<Person, Person> peopleByForename = new HashMap<string, Tuple2<Person, Person>>();

// populate it
peopleByForename.put("Bob", new Tuple2(new Person("Bob Smith",
                                       new Person("Bob Jones"));

// read from it
Tuple<Person, Person> bobs = peopleByForename["Bob"];
Person bob1 = bobs.Item1;
Person bob2 = bobs.Item2;

Это лучшее решение, на мой взгляд.

4. Несколько карт

// create our maps
Map<string, Person> firstPersonByForename = new HashMap<string, Person>();
Map<string, Person> secondPersonByForename = new HashMap<string, Person>();

// populate them
firstPersonByForename.put("Bob", new Person("Bob Smith"));
secondPersonByForename.put("Bob", new Person("Bob Jones"));

// read from them
Person bob1 = firstPersonByForename["Bob"];
Person bob2 = secondPersonByForename["Bob"];

Недостатком этого решения является то, что не очевидно, что эти две карты связаны, программная ошибка может видеть, что две карты выходят из синхронизации.

218
ответ дан Paul Ruane 21 August 2018 в 17:35
поделиться
  • 1
    Привет, Пол ... можете сделать это немного понятнее ... на примере ...? – vidhya 10 February 2011 в 14:42
  • 2
    @vidhya: что особенно подходит вашей проблеме? Являются ли ваши несколько объектов одинаковыми или разными? – Paul Ruane 10 February 2011 в 15:49
  • 3
    Пример был бы велик. – Xonatron 10 February 2012 в 23:08
  • 4
    @Paul, любой простой пример кода для # 3 Map<KeyType, Tuple<Value1Type, Value2Type>> – joarderm 24 June 2013 в 14:39
  • 5
    Код содержит много ошибок. – CoolMind 24 December 2015 в 09:10

Я предпочитаю следующее хранить любое количество переменных без создания отдельного класса.

final public static Map<String, Map<String, Float>> myMap    = new HashMap<String, Map<String, Float>>();
0
ответ дан Özgen Eren 21 August 2018 в 17:35
поделиться
2
ответ дан Arjan Tijms 21 August 2018 в 17:35
поделиться

Взгляните на Multimap из библиотек guava и его реализацию - HashMultimap

Коллекция, подобная карте, но которая может ассоциироваться несколько значений с помощью одного ключа. Если вы дважды вызываете put (K, V) с одним и тем же ключом, но с разными значениями, мультимап содержит сопоставления из ключа для обоих значений.

11
ответ дан Bozho 21 August 2018 в 17:35
поделиться

Если вы используете Spring Framework. Существует org.springframework.util.MultiValueMap.

Чтобы создать немодифицируемую карту с несколькими значениями:

Map<String,List<String>> map = ...
MultiValueMap<String, String> multiValueMap = CollectionUtils.toMultiValueMap(map);

Или используйте org.springframework.util.LinkedMultiValueMap

3
ответ дан Igor Rybak 21 August 2018 в 17:35
поделиться
HashMap<Integer,ArrayList<String>> map = new    HashMap<Integer,ArrayList<String>>();

ArrayList<String> list = new ArrayList<String>();
list.add("abc");
list.add("xyz");
map.put(100,list);
4
ответ дан Janarthanan Ramu 21 August 2018 в 17:35
поделиться

Может быть выполнено с использованием идентификатораHashMap, подвергнутого условию, что сравнение ключей будет выполняться оператором ==, а не equals ().

0
ответ дан jayendra bhatt 21 August 2018 в 17:35
поделиться

Самый простой способ - использовать библиотеку коллекций google:

import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap;

открытый класс Test {

public static void main(final String[] args) {

    // multimap can handle one key with a list of values
    final Multimap<String, String> cars = ArrayListMultimap.create();
    cars.put("Nissan", "Qashqai");
    cars.put("Nissan", "Juke");
    cars.put("Bmw", "M3");
    cars.put("Bmw", "330E");
    cars.put("Bmw", "X6");
    cars.put("Bmw", "X5");

    cars.get("Bmw").forEach(System.out::println);

    // It will print the:
    // M3
    // 330E
    // X6
    // X5
}

}

maven link: https: // mvnrepository.com/artifact/com.google.collections/google-collections/1.0-rc2

подробнее об этом: http://tomjefferys.blogspot.be/2011/09 /multimaps-google-guava.html

1
ответ дан Jorciney 21 August 2018 в 17:35
поделиться

Еще один приятный выбор - использовать MultiValuedMap из Apache Commons. Взгляните на все известные классы реализации в верхней части страницы для специализированных реализаций.

Пример:

HashMap<K, ArrayList<String>> map = new HashMap<K, ArrayList<String>>()

можно заменить на

MultiValuedMap<K, String> map = new MultiValuedHashMap<K, String>();

Таким образом,

map.put(key, "A");
map.put(key, "B");
map.put(key, "C");

Collection<String> coll = map.get(key);

приведет к сбору coll, содержащему «A», «B» и «C».

21
ответ дан Matthew Steven Monkan 21 August 2018 в 17:35
поделиться

Мы можем создать класс, чтобы иметь несколько ключей или значений, а объект этого класса можно использовать в качестве параметра на карте. Вы можете обратиться к https://stackoverflow.com/a/44181931/8065321

0
ответ дан metame 21 August 2018 в 17:35
поделиться

Да и нет. Решение состоит в том, чтобы создать кластер Wrapper для ваших значений, который содержит 2 (3 или более) значения, соответствующие вашему ключу.

2
ответ дан Nicolas 21 August 2018 в 17:35
поделиться

Попробуйте LinkedHashMap, sample:

Map<String,String> map = new LinkedHashMap<String,String>();    
map.put('1','linked');map.put('1','hash');    
map.put('2','map');map.put('3','java');.. 

output:

: 1,1,2,3

значения: связаны, хэш, карта, java

-8
ответ дан noahnu 21 August 2018 в 17:35
поделиться
  • 1
    Это не сработает. linked больше не будет отображаться на карте, потому что вы заменили его на hash. – Jeff Mercado 19 April 2013 в 19:44

Я не мог опубликовать ответ на комментарий Пола, поэтому я создаю новый комментарий для Vidhya здесь:

Wrapper будет SuperClass для двух классов, которые мы хотим сохранить как значение.

и внутри класса оболочки, мы можем поместить ассоциации как объекты переменных экземпляра для двух объектов класса.

, например

class MyWrapper {

 Class1 class1obj = new Class1();
 Class2 class2obj = new Class2();
...
}

, а в HashMap мы можем Таким образом,

Map<KeyObject, WrapperObject> 

WrapperObj будет иметь переменные класса: class1Obj, class2Obj

0
ответ дан Puffin GDI 21 August 2018 в 17:35
поделиться

Вот ОТВЕТ:):)

Строка key = "services_servicename"

Данные ArrayList;

для (int i = 0; i lessthen data.size (); i ++) {

        HashMap<String, String> servicesNameHashmap = new HashMap<String, String>();
        servicesNameHashmap.put(key,data.get(i).getServiceName());
        mServiceNameArray.add(i,servicesNameHashmap);   }

У меня есть лучшие результаты.

Вам просто нужно создать новый HashMap Как

HashMap servicesNameHashmap = new HashMap ();

в вашей петле. Он будет иметь тот же эффект, что и тот же ключ и несколько значений.

Счастливое кодирование:)

0
ответ дан Shahid 21 August 2018 в 17:35
поделиться

Только для записи чистым решением JDK8 было бы использовать метод Map::compute:

map.compute(key, (s, strings) -> strings == null ? new ArrayList<>() : strings).add(value);

Например, как

public static void main(String[] args) {
    Map<String, List<String>> map = new HashMap<>();

    put(map, "first", "hello");
    put(map, "first", "foo");
    put(map, "bar", "foo");
    put(map, "first", "hello");

    map.forEach((s, strings) -> {
        System.out.print(s + ": ");
        System.out.println(strings.stream().collect(Collectors.joining(", ")));
    });
}

private static <KEY, VALUE> void put(Map<KEY, List<VALUE>> map, KEY key, VALUE value) {
    map.compute(key, (s, strings) -> strings == null ? new ArrayList<>() : strings).add(value);
}

с выходом:

bar: foo
first: hello, foo, hello

Обратите внимание, что для обеспечения согласованности в случае, когда несколько потоков обращаются к этой структуре данных, необходимо использовать ConcurrentHashMap и CopyOnWriteArrayList.

3
ответ дан Stepan Vavra 21 August 2018 в 17:35
поделиться
  • 1
    Лучше использовать computeIfAbsent. map.computeIfAbsent(key, k -> new ArrayList<>()).add(value); – saka1029 30 December 2016 в 01:54

Я использую Map<KeyType, Object[]> для связывания нескольких значений с ключом на карте. Таким образом, я могу хранить несколько значений различных типов, связанных с ключом. Вы должны позаботиться, поддерживая правильный порядок вставки и извлечения из Object [].

Пример. Подумайте, мы хотим сохранить информацию Студента. Ключ - это id, в то время как мы хотели бы сохранить имя, адрес и адрес электронной почты, связанные с учащимся.

       //To make entry into Map
        Map<Integer, String[]> studenMap = new HashMap<Integer, String[]>();
        String[] studentInformationArray = new String[]{"name", "address", "email"};
        int studenId = 1;
        studenMap.put(studenId, studentInformationArray);

        //To retrieve values from Map
        String name = studenMap.get(studenId)[1];
        String address = studenMap.get(studenId)[2];
        String email = studenMap.get(studenId)[3];
6
ответ дан Sudarshan_SMD 21 August 2018 в 17:35
поделиться
  • 1
    Для меня это лучший ответ. Это проще, более кратким и менее абстрактным. – Morey 4 January 2017 в 04:25

Нет, не только как HashMap. В основном вам понадобится HashMap из ключа в набор значений.

Если вы счастливы использовать внешние библиотеки, Guava имеет именно это понятие в Multimap с реализациями, такими как ArrayListMultimap и HashMultimap .

53
ответ дан Sven Niehus 21 August 2018 в 17:35
поделиться
  • 1
    @ Джон, не могли бы вы предоставить рабочий пример в Java для вышеуказанного вопроса, заданного OP.Highly оценили, можете ли вы опубликовать его – Deepak 10 February 2011 в 19:04
  • 2
    @Deepak: найдите примеры мультимапов guava, и вы найдете пример кода. – Jon Skeet 10 February 2011 в 19:11
  • 3
    @ Джон, жаль беспокоить вас снова и снова, я не хочу использовать gauva, как я могу достичь этого в Core Java. Не используем Gauava, и мы не должны использовать MultiMap. Могли бы вы предоставить рабочий пример в Core Java только – Deepak 10 February 2011 в 19:16
  • 4
  • 5
    у вас есть рабочий пример для HashMap<String, List<Integer>> – Deepak 10 February 2011 в 19:26
  • 6
    @Deepak: Я предлагаю вам попробовать создать пример самостоятельно, и если вы застряли, задайте вопрос, включая код, насколько это у вас есть. Вы узнаете намного больше. – Jon Skeet 10 February 2011 в 20:28

Вы можете сделать это неявно.

// Create the map. There is no restriction to the size that the array String can have
HashMap<Integer, String[]> map = new HashMap<Integer, String[]>();

//initialize a key chosing the array of String you want for your values
map.put(1, new String[] { "name1", "name2" });

//edit value of a key
map.get(1)[0] = "othername";

Это очень просто и эффективно. Если вам нужны значения разных классов, вы можете сделать следующее:

HashMap<Integer, Object[]> map = new HashMap<Integer, Object[]>();
0
ответ дан Veiga 21 August 2018 в 17:35
поделиться

Я так привык делать это с помощью Словаря данных в Objective C. Сложнее было получить аналогичный результат в Java для Android. Я закончил создание пользовательского класса, а затем просто сделал хэш-файл моего пользовательского класса.

public class Test1 {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.addview);

//create the datastring
    HashMap<Integer, myClass> hm = new HashMap<Integer, myClass>();
    hm.put(1, new myClass("Car", "Small", 3000));
    hm.put(2, new myClass("Truck", "Large", 4000));
    hm.put(3, new myClass("Motorcycle", "Small", 1000));

//pull the datastring back for a specific item.
//also can edit the data using the set methods.  this just shows getting it for display.
    myClass test1 = hm.get(1);
    String testitem = test1.getItem();
    int testprice = test1.getPrice();
    Log.i("Class Info Example",testitem+Integer.toString(testprice));
}
}

//custom class.  You could make it public to use on several activities, or just include in the activity if using only here
class myClass{
    private String item;
    private String type;
    private int price;

    public myClass(String itm, String ty, int pr){
        this.item = itm;
        this.price = pr;
        this.type = ty;
    }

    public String getItem() {
        return item;
    }

    public void setItem(String item) {
        this.item = item;
    }

    public String getType() {
        return item;
    }

    public void setType(String type) {
        this.type = type;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

}
0
ответ дан Vette 21 August 2018 в 17:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: