Используя ваш пример dataframe, мы могли бы:
xtabs(value ~ name + numbers, data = dat1)
List<Value> list = new ArrayList<Value>(map.values());
, предполагая:
Map<Key,Value> map;
список того, что?
Предполагая, что map
- ваш экземпляр Map
map.values()
, вернет Collection
, содержащий все карты значения. map.keySet()
вернет Set
, содержащий все клавиши карты. Проблема заключается в том, что 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
HashMap
и подобных не отсортированных реализаций Map
он будет эффективно случайным.
– Joachim Sauer
30 March 2011 в 09:02
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());
}
Вот общий метод получения значений из карты.
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;
}
map.entrySet()
дает вам коллекцию объектов Map.Entry
, содержащих как ключ, так и значение. вы можете преобразовать это в любой объект коллекции, который вам нравится, например new ArrayList(map.entrySet())
;
Если вы хотите, чтобы значения в результирующем 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
, для разнообразия ).
Я думаю, вы хотите преобразовать значения, содержащиеся в Map
, в list
? Самый простой способ - вызвать метод values()
интерфейса Map
. Это вернет Collection
объектов значения, содержащихся в Map
.
Обратите внимание, что этот Collection
поддерживается объектом Map
, и любые изменения в объекте Map
будут отображаться здесь , Поэтому, если вам нужна отдельная копия, не привязанная к вашему объекту Map
, просто создайте новый объект List
, например ArrayList
, передав значение Collection
, как показано ниже.
ArrayList<String> list = new ArrayList<String>(map.values());
Использование Java 8 Streams API.
List<Value> values = map.values().stream().collect(Collectors.toList());
// 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());
}
"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());
} "
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);
}
};
Вы можете сделать это следующим образом:
List<Value> list = new ArrayList<Value>(map.values());
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, итерируя по списку.
Collection
доList
будет работать. – asgs 18 June 2013 в 22:28keySet()
иvalues()
, обычно являются объектами прокладки, которые предоставляют представление Set или Collection для базовой структуры (keySet()
возвращает Set, чтобы подчеркивать отсутствие обманов). Дляvalues()
возвращаемый объект может i> бытьList
, но часто этого не будет. Создание реального списка, как вы говорите, нарушает связь, что означает, что вы больше не зависите от исходной карты. Иногда, однако, вам нужен только список, потому что для некоторых API требуется одно - усиление правила, что хороший API должен требовать только самые абстрактные интерфейсы, от которых он может уйти ... – SusanW 9 September 2016 в 10:26