RxJava: преобразование карты & lt; String, CryptoCoin & gt; для списка & lt; CryptoCoin & gt; [Дубликат]

Используя ваш пример dataframe, мы могли бы:

xtabs(value ~ name + numbers, data = dat1)
576
задан Javaa 31 October 2011 в 19:12
поделиться

14 ответов

List<Value> list = new ArrayList<Value>(map.values());

, предполагая:

Map<Key,Value> map;
1129
ответ дан cletus 22 August 2018 в 15:52
поделиться
  • 1
    Благодаря! Я предполагал, что работа с Collection до List будет работать. – asgs 18 June 2013 в 22:28
  • 2
    Я подозреваю причину, по которой он не работает, потому что коллекция, возвращаемая значениями (), зависит от базовой карты; вместо этого вместо вызова конструктора копирования вы выделяете хранилище и копируете значения в это хранилище, тем самым нарушая соединение ... – Sheldon R. 22 November 2013 в 18:14
  • 3
    Если у нас есть LinkedHashMap - порядок останется таким же? – user 6 June 2015 в 18:42
  • 4
    @ user2022068 да, порядок должен быть сохранен с помощью LinkedHashMap. – SusanW 9 September 2016 в 10:16
  • 5
    @SheldonR. yes - коллекции, возвращаемые keySet() и values(), обычно являются объектами прокладки, которые предоставляют представление Set или Collection для базовой структуры (keySet() возвращает Set, чтобы подчеркивать отсутствие обманов). Для values() возвращаемый объект может быть List, но часто этого не будет. Создание реального списка, как вы говорите, нарушает связь, что означает, что вы больше не зависите от исходной карты. Иногда, однако, вам нужен только список, потому что для некоторых API требуется одно - усиление правила, что хороший API должен требовать только самые абстрактные интерфейсы, от которых он может уйти ... – SusanW 9 September 2016 в 10:26

список того, что?

Предполагая, что map - ваш экземпляр Map

  • map.values(), вернет Collection, содержащий все карты значения.
  • map.keySet() вернет Set, содержащий все клавиши карты.
20
ответ дан aberrant80 22 August 2018 в 15:52
поделиться

Проблема заключается в том, что Map имеет два значения (ключ и значение), тогда как List имеет только одно значение (элемент).

Поэтому лучшее, что можно сделать, это либо получить List ключей, либо значения. (Если мы не сделаем обертку для привязки к паре ключ / значение).

Скажем, у нас есть Map:

Map<String, String> m = new HashMap<String, String>();
m.put("Hello", "World");
m.put("Apple", "3.14");
m.put("Another", "Element");

Клавиши в качестве List могут получить ArrayList из Set , возвращенного методом Map.keySet :

List<String> list = new ArrayList<String>(m.keySet());

Хотя можно получить значения как List, создавая новый ArrayList из Collection , возвращенный методом Map.values :

List<String> list = new ArrayList<String>(m.values());

Результат получения List ключей:

Apple
Another
Hello

Результат получения List значений:

3.14
Element
World
124
ответ дан coobird 22 August 2018 в 15:52
поделиться
  • 1
    Следует отметить, что порядок значений, возвращаемых этими методами, не определен , а для HashMap и подобных не отсортированных реализаций Map он будет эффективно случайным. – Joachim Sauer 30 March 2011 в 09:02
  • 2
    Да, вы должны знать, что это LinkedHashMap или что-то в этом роде. Проблема с исходным вопросом заключается в том, что вопрос искажен, то есть он нуждается в редактировании. Вопрос заключается не в преобразовании Карты в список, а в том, как получить значения карты в виде списка. Значения метода дают вам коллекцию, но не список, и, следовательно, необходимость в аккуратном небольшом трюке. – demongolem 11 February 2012 в 21:47
  • 3
    Я думаю, вы можете добавить к своему ответу, что @ M0les говорит: «Вам нужно будет« пройти через », SortedMap как-то. Либо начните с конкретной реализации SortedMap (например, TreeMap), либо вставьте свою входную карту в SortedMap, прежде чем конвертировать ее в список – Ignacio Rubio 17 November 2014 в 17:33
        HashMap<Integer, List<String>> map = new HashMap<>(); 
        List<String> list = new ArrayList<String>();
        list.add("Java");
        list.add("Primefaces");
        list.add("JSF");
        map.put(1,list);
    if(map != null){
     return new ArrayList<String>((Collection<? extends String>) map.values());
    }
1
ответ дан Hakan 22 August 2018 в 15:52
поделиться

Вот общий метод получения значений из карты.

public static <T> List<T> ValueListFromMap(HashMap<String, T> map) {
    List<T> thingList = new ArrayList<>();

    for (Map.Entry<String, T> entry : map.entrySet()) {
        thingList.add(entry.getValue());
    }

    return thingList;
}
0
ответ дан Hearaman 22 August 2018 в 15:52
поделиться

map.entrySet() дает вам коллекцию объектов Map.Entry, содержащих как ключ, так и значение. вы можете преобразовать это в любой объект коллекции, который вам нравится, например new ArrayList(map.entrySet());

19
ответ дан java dude 22 August 2018 в 15:52
поделиться

Если вы хотите, чтобы значения в результирующем List<Value> находились в порядке ввода ключа Map<Key, Value>, вам нужно как-то «пройти через» SortedMap.

Либо запустите с конкретной реализацией SortedMap (например TreeMap) или вставьте ваш вход Map в SortedMap, прежде чем преобразовать его в List. например:

Map<Key,Value> map;
List<Value> list = new ArrayList<Value>( new TreeMap<Key Value>( map ));

В противном случае вы получите любой нативный порядок, предоставляемый реализацией Map, который часто может быть чем-то иным, чем упорядочение естественного ключа (Try Hashtable или ConcurrentHashMap, для разнообразия ).

4
ответ дан M0les 22 August 2018 в 15:52
поделиться

Я думаю, вы хотите преобразовать значения, содержащиеся в Map, в list? Самый простой способ - вызвать метод values() интерфейса Map. Это вернет Collection объектов значения, содержащихся в Map.

Обратите внимание, что этот Collection поддерживается объектом Map, и любые изменения в объекте Map будут отображаться здесь , Поэтому, если вам нужна отдельная копия, не привязанная к вашему объекту Map, просто создайте новый объект List, например ArrayList, передав значение Collection, как показано ниже.

ArrayList<String> list = new ArrayList<String>(map.values());
12
ответ дан maneesh 22 August 2018 в 15:52
поделиться

Использование Java 8 Streams API.

List<Value> values = map.values().stream().collect(Collectors.toList());
23
ответ дан Matej Kormuth 22 August 2018 в 15:52
поделиться
  • 1
    Я предпочитаю принятый, основанный на конструкторе ответ. Потоки должны быть для упрощения кода. – Aaron 24 February 2017 в 12:15
  • 2
    @Aaron Да, для задачи получения списка значений из Map конструктор кажется более простым. Однако, если вы используете Streams extensivly в кодовой базе, лучше оставаться последовательным. – Matej Kormuth 24 February 2017 в 14:57
// you can use this
List<Value> list = new ArrayList<Value>(map.values());

// or you may use 
List<Value> list = new ArrayList<Value>();
for (Map.Entry<String, String> entry : map.entrySet())
{
list.add(entry.getValue());    
}
0
ответ дан saurabhgoyal795 22 August 2018 в 15:52
поделиться
"Map<String , String > map = new HapshMap<String , String>;
 map.add("one","java");
 map.add("two" ,"spring");
 Set<Entry<String,String>> set =  map.entrySet();
 List<Entry<String , String>> list = new ArrayList<Entry<String , String>>    (set);
 for(Entry<String , String> entry : list ) {
   System.out.println(entry.getKey());
   System.out.println(entry.getValue());
 } "
1
ответ дан siva prasad 22 August 2018 в 15:52
поделиться
Comparator<String> comparator = new Comparator<String>() {

    @Override
    public int compare(String s1, String s2) {
        if (s1 == s2) {
            return 0;
        }

        if (s1 == null) {
            return -1;
        }

        if (s2 == null) {
            return 1;
        }

        return s1.compareToIgnoreCase(s2);
    }
};
-1
ответ дан smottt 22 August 2018 в 15:52
поделиться
  • 1
    кажется не очень актуальным для вопроса OP ... – L Joey 2 March 2017 в 06:53
  • 2
    Я не вижу никакого отношения к вопросу – Samuel Méndez 18 April 2017 в 10:32

Вы можете сделать это следующим образом:

List<Value> list = new ArrayList<Value>(map.values());
6
ответ дан SpringLearner 22 August 2018 в 15:52
поделиться
  • 1
    OP спросить о том, как преобразовать в List & lt; value & gt ;. Когда вы предоставляете ответы, лучше включить Хорошее описание с предлагаемым решением. Этот вопрос уже принят. – HaveNoDisplayName 23 November 2014 в 01:45
    Map<String, Integer> map = new HashMap<String, Integer>();
    map.put("java", 20);
    map.put("C++", 45);

    Set <Entry<String, Integer>> set = map.entrySet();

    List<Entry<String, Integer>> list = new ArrayList<Entry<String, Integer>>(set);

мы можем иметь как пару ключей, так и значение в списке. Также можно получить ключ и значение, используя Map.Entry, итерируя по списку.

3
ответ дан user11 22 August 2018 в 15:52
поделиться
Другие вопросы по тегам:

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