Nasıl bir harita Java listeye dönüştürmek için?


675

Bir dönüştürmek için en iyi yolu nedir Map<key,value>a List<value>? Sadece tüm değerleri tekrarlayın ve bir listeye ekleyin ya da bir şey mi görüyorum?


1
Eğer haritayı listeye dönüştürmek gerekiyorsa iyi bir model olmadığını düşünüyorum. Kod, bu durum oluşmayacak şekilde yazılmalıdır.
Böcekler

Yanıtlar:


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

varsayarak:

Map<Key,Value> map;

7
Teşekkürler! Ben gelen döküm üstlendiğini Collectioniçin Listçalışacak.
asgs

1
Bunun işe yaramadığından şüpheleniyorum, değerlerin () tarafından döndürülen koleksiyonun temeldeki Haritaya bağlı olması; bunun yerine bir kopya oluşturucu çağrısı yaparak, depolama alanı ayırır ve değerleri bu depolamaya kopyalarsınız, böylece bağlantıyı
koparırsınız

4
LinkedHashMap varsa - sipariş aynı mı kalacak?

1
@ user2022068 evet, sipariş LinkedHashMap ile korunmalıdır.
SusanW

1
@SheldonR. evet - tarafından döndürülen keySet()ve values()genellikle altta yatan yapının bir Küme veya Koleksiyon görünümünü veren şim nesneleridir ( keySet()çiftleri vurgulamak için bir Küme döndürür). İçin values(), döndürülen nesne olabilir bir olmak List, ama çoğu olmayacaktır. Söylediğiniz gibi gerçek bir Liste oluşturmak, orijinal Haritaya artık bağımlı olmadığınız anlamına gelen bağlantıyı keser. Bazen de, sadece bir Listeye ihtiyacınız vardır, çünkü bazı
API'lar

137

Buradaki sorun Map, iki değerinin (bir anahtar ve değer), Listyalnızca bir değerinin (bir öğe) olmasıdır.

Bu nedenle, yapılabilecek en iyi şey Listanahtarlardan birini veya değerleri almaktır. (Anahtar / değer çiftini tutmak için bir sarıcı yapmadığımız sürece).

Diyelim ki Map:

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

A olarak anahtarlar , yöntem tarafından döndürülenlerden Listyeni ArrayListbir tane oluşturularak elde edilebilir :SetMap.keySet

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

Bir değerindedir birlikte Listyeni bir oluşturma elde edilebilir ArrayListbir mesafede Collectiontarafından döndürülen Map.valuesbir yöntem:

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

ListAnahtarların alınmasının sonucu :

elma
Bir diğeri
Merhaba

ListDeğerlerin alınmasının sonucu :

3.14
eleman
Dünya

3
Bu yöntemler ile geri değerlerinin sırası olduğu not edilmelidir tanımlanmamış ve için HashMapbenzer un kriteri ve Mapuygulamalar etkili rastgele olacaktır.
Joachim Sauer

1
Evet, bunun LinkedHashMap veya bu tür bir şey olduğunu bilmelisiniz. Orijinal soru ile ilgili sorun, sorunun yanlış olması, yani düzenlemeye ihtiyaç duymasıdır. Soru, bir haritayı listeye dönüştürmek değil, haritanın değerlerini liste olarak nasıl elde edeceğinizdir. Yöntem değerleri size bir Koleksiyon verir, ancak bir liste vermez ve bu nedenle düzgün bir küçük numaraya ihtiyaç duyar.
demongolem

Sanırım @ M0les'ın söylediklerine cevabınızı ekleyebilirsiniz: SortedMap'ı bir şekilde "geçmeniz" gerekecek. Somut bir SortedMap uygulamasıyla başlayın (TreeMap gibi) veya giriş Haritanızı List'e dönüştürmeden önce bir SortedMap'e ekleyin
Ignacio Rubio

41

Java 8 Streams API'sını kullanma.

List<Value> values = map.values().stream().collect(Collectors.toList());

8
Kabul edilmiş, kurucu temelli yanıtı tercih ederim. Akışlar, kodu basitleştirmek için olmalıdır.
Aaron

1
@Aaron Evet, Haritadan bir değerler listesi almak için yapıcı daha basit görünüyor. Ancak Akışları bir kod tabanında yaygın olarak kullanıyorsanız tutarlı kalmak daha iyidir.
Matej Kormuth

1
Ben kullandığımda bu büyük miktarda veri alıyorsanız bir hata olsun .. iplik java.util.stream.ReduceOps $ 3.makeSink (Bilinmeyen Kaynak) üzerinde döngü. İş parçacıkları sonsuz döngü yaparsa, CPU tüketimi artmaya başlar. Döngü iplikleri yığın izi aşağıda verilmiştir, inceleyin
Ganesh Giri

24

map.entrySet()size Map.Entryhem anahtar hem de değer içeren bir nesne koleksiyonu sunar . daha sonra bunu istediğiniz gibi herhangi bir koleksiyon nesnesine dönüştürebilirsiniz new ArrayList(map.entrySet());


23

ne listesi?

Varsayalım mapkiMap

  • map.values()Collectionharitanın tüm değerlerini içeren bir değer döndürür .
  • map.keySet()Setharitanın tüm anahtarlarını içeren bir döndürür .

14

Sana içerdiği değerleri dönüştürmek istediğiniz tahmin Mapa list? En kolayı, arabirimin values()yöntemini çağırmaktır Map. Bu, Collectioniçinde yer alan değer nesnelerini döndürür Map.

Bunun nesne Collectiontarafından desteklendiğini ve Mapnesnede yapılan değişikliklerin Mapburada yansıtılacağını unutmayın. Dolayısıyla, Mapnesnenize bağlı olmayan ayrı bir kopya istiyorsanız , değeri aşağıdaki Listgibi ArrayListiletmek gibi yeni bir nesne oluşturmanız yeterlidir Collection.

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

6

Böyle yapabilirsin

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

1
OP <Değer> Listesine nasıl dönüştürüleceğini sorar. Yanıt verirken, önerilen çözümle İyi Açıklama eklemek daha iyidir. Bu soru zaten cevaplandı.
HaveNoDisplayName

5

Sonuçtaki değerlerin List<Value>girişin anahtar sıralamasında olduğundan emin olmak istiyorsanız Map<Key, Value>, "geçmeniz" gerekirSortedMap .

Ya başlamak somut olan SortedMap(Mesela uygulanması TreeMap) ya da girişinizi eklemek Mapbir içine SortedMapo dönüştürmeden önce List. Örneğin:

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

Aksi takdirde, Mapuygulamanın sağladığı doğal siparişi alırsınız , bu genellikle doğal anahtar siparişinden başka bir şey olabilir (Deneyin Hashtableveya ConcurrentHashMapçeşitlilik için).


5
    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);

Listede hem anahtar hem de değer çiftine sahip olabiliriz.Ayrıca liste üzerinden yineleyerek Map.Entry kullanarak anahtar ve değer alabilirsiniz.


4
// 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());    
}

1
"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

İşte değerleri haritadan almanın genel yöntemi.

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;
}

1
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());
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.