Dapatkan kunci dari HashMap di Jawa

167

Saya memiliki Hashmap di Jawa seperti ini:

private Map<String, Integer> team1 = new HashMap<String, Integer>();

Maka saya mengisinya seperti ini:

team1.put("United", 5);

Bagaimana saya bisa mendapatkan kunci? Sesuatu seperti: team1.getKey()mengembalikan "Bersatu".

masb
sumber
Apa yang Anda harapkan team1.getKey()untuk kembali jika: (1) peta kosong, atau (2) jika berisi beberapa kunci?
NPE
intharus digunakan untuk yang lajang seperti ini.
stommestack

Jawaban:

313

A HashMapmengandung lebih dari satu kunci. Anda dapat menggunakan keySet()untuk mendapatkan set semua kunci.

team1.put("foo", 1);
team1.put("bar", 2);

akan menyimpan 1dengan kunci "foo"dan 2dengan kunci "bar". Untuk beralih ke semua kunci:

for ( String key : team1.keySet() ) {
    System.out.println( key );
}

akan mencetak "foo"dan "bar".

Matteo
sumber
Tetapi dalam hal ini saya hanya memiliki satu kunci untuk setiap nilai. Tidak mungkin menulis apa pun seperti team1.getKey ()?
masb
Tidak, Anda memiliki peta dengan satu elemen. Tapi ini peta: struktur yang bisa mengandung lebih dari satu elemen.
Matteo
13
Apa gunanya Peta dengan satu kunci? Buat kelas dengan bidang kunci dan bidang nilai.
JB Nizet
Saya salah mengerti masalah saya. Terima kasih atas jawaban anda
masb
3
Jika Anda ingin menyimpan semua kunci dalam daftar larik:List<String> keys = new ArrayList<>(mLoginMap.keySet());
Pratik Butani
50

Ini bisa dilakukan, setidaknya secara teori, jika Anda tahu indeksnya:

System.out.println(team1.keySet().toArray()[0]);

keySet() mengembalikan set, jadi Anda mengonversi set ke array.

Masalahnya, tentu saja, satu set tidak berjanji untuk menjaga pesanan Anda. Jika Anda hanya memiliki satu item di HashMap Anda, Anda baik, tetapi jika Anda memiliki lebih dari itu, yang terbaik adalah mengulang-ulang peta, seperti yang dilakukan jawaban lain.

james.garriss
sumber
Ini membantu dalam skenario pengujian unit di mana Anda memiliki kontrol penuh atas konten Anda HashMap. Pertunjukan yang bagus.
risingTide
Tidak ada yang tahu tentang indeks dalam pertanyaan.
Marquis of Lorne
23

Periksa ini.

https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html

(Gunakan java.util.Objects.equalskarena HashMap dapat berisi null)

Menggunakan JDK8 +

/**
 * Find any key matching a value.
 *
 * @param value The value to be matched. Can be null.
 * @return Any key matching the value in the team.
 */
private Optional<String> getKey(Integer value){
    return team1
        .entrySet()
        .stream()
        .filter(e -> Objects.equals(e.getValue(), value))
        .map(Map.Entry::getKey)
        .findAny();
}

/**
 * Find all keys matching a value.
 *
 * @param value The value to be matched. Can be null.
 * @return all keys matching the value in the team.
 */
private List<String> getKeys(Integer value){
    return team1
        .entrySet()
        .stream()
        .filter(e -> Objects.equals(e.getValue(), value))
        .map(Map.Entry::getKey)
        .collect(Collectors.toList());
}

Lebih "generik" dan seaman mungkin

/**
 * Find any key matching the value, in the given map.
 *
 * @param mapOrNull Any map, null is considered a valid value.
 * @param value     The value to be searched.
 * @param <K>       Type of the key.
 * @param <T>       Type of the value.
 * @return An optional containing a key, if found.
 */
public static <K, T> Optional<K> getKey(Map<K, T> mapOrNull, T value) {
    return Optional.ofNullable(mapOrNull).flatMap(map -> map.entrySet()
            .stream()
            .filter(e -> Objects.equals(e.getValue(), value))
            .map(Map.Entry::getKey)
            .findAny());
}

Atau jika Anda menggunakan JDK7.

private String getKey(Integer value){
    for(String key : team1.keySet()){
        if(Objects.equals(team1.get(key), value)){
            return key; //return the first found
        }
    }
    return null;
}

private List<String> getKeys(Integer value){
   List<String> keys = new ArrayList<String>();
   for(String key : team1.keySet()){
        if(Objects.equals(team1.get(key), value)){
             keys.add(key);
      }
   }
   return keys;
}
Fabio F.
sumber
2
Tetapi apa yang terjadi jika beberapa kunci memetakan nilai yang sama? Anda harus mengembalikan daftar kunci sebagai gantinya
Óscar López
@ ÓscarLópez Mereka tidak bisa. HashMapkunci unik.
Marquis of Lorne
6

Anda dapat mengambil semua Mapkunci menggunakan metode keySet(). Sekarang, jika yang Anda butuhkan adalah mendapatkan kunci yang diberikan nilainya , itu masalah yang sama sekali berbeda dan Maptidak akan membantu Anda di sana; Anda memerlukan struktur data khusus, seperti BidiMap(peta yang memungkinkan pencarian dua arah antara kunci dan nilai) dari Koleksi Commons Apache - juga perlu diketahui bahwa beberapa kunci berbeda dapat dipetakan dengan nilai yang sama.

Óscar López
sumber
1

Jika Anda hanya memerlukan sesuatu yang sederhana dan lebih banyak verifikasi.

public String getKey(String key)
{
    if(map.containsKey(key)
    {
        return key;
    }
    return null;
}

Kemudian Anda dapat mencari kunci apa saja.

System.out.println( "Does this key exist? : " + getKey("United") );
tzg
sumber
1
Metode ini benar-benar berlebihan.
Marquis of Lorne
1
private Map<String, Integer> _map= new HashMap<String, Integer>();
Iterator<Map.Entry<String,Integer>> itr=  _map.entrySet().iterator();
                //please check 
                while(itr.hasNext())
                {
                    System.out.println("key of : "+itr.next().getKey()+" value of      Map"+itr.next().getValue());
                }
sachin
sumber
Tidak bekerja Jelas Anda belum mencobanya. Memanggil next()dua kali dalam loop berarti Anda akan mencetak kunci bernomor ganjil bersama dengan nilai genap.
Marquis of Lorne
0

Gunakan operasi fungsional untuk iterasi yang lebih cepat.

team1.keySet().forEach((key) -> { System.out.println(key); });

eCuzzy
sumber
-1

Sebuah solusi dapat, jika Anda mengetahui posisi kunci, mengubah kunci menjadi array String dan mengembalikan nilai di posisi:

public String getKey(int pos, Map map) {
    String[] keys = (String[]) map.keySet().toArray(new String[0]);

    return keys[pos];
}
Orici
sumber
Tidak ada yang tahu tentang indeks dalam pertanyaan.
Marquis of Lorne
-2

Coba program sederhana ini:

public class HashMapGetKey {

public static void main(String args[]) {

      // create hash map

       HashMap map = new HashMap();

      // populate hash map

      map.put(1, "one");
      map.put(2, "two");
      map.put(3, "three");
      map.put(4, "four");

      // get keyset value from map

Set keyset=map.keySet();

      // check key set values

      System.out.println("Key set values are: " + keyset);
   }    
}
raman rayat
sumber
-2
public class MyHashMapKeys {

    public static void main(String a[]){
        HashMap<String, String> hm = new HashMap<String, String>();
        //add key-value pair to hashmap
        hm.put("first", "FIRST INSERTED");
        hm.put("second", "SECOND INSERTED");
        hm.put("third","THIRD INSERTED");
        System.out.println(hm);
        Set<String> keys = hm.keySet();
        for(String key: keys){
            System.out.println(key);
        }
    }
}
Abdul Rizwan
sumber
Hanya menyalin jawaban yang ada. -1
james.garriss
-2

Untuk mendapatkan kunci di HashMap, Kami memiliki metode keySet () yang ada dalam java.util.Hashmappaket. mis:

Map<String,String> map = new Hashmap<String,String>();
map.put("key1","value1");
map.put("key2","value2");

// Now to get keys we can use keySet() on map object
Set<String> keys = map.keySet();

Sekarang kunci akan memiliki semua kunci Anda tersedia di peta. mis: [key1, key2]

ghanshyam singh
sumber
java,util.HashMapadalah kelas, bukan paket, dan tidak ada di sini yang tidak ada di sini lima tahun yang lalu.
Marquis of Lorne
-3

Apa yang akan saya lakukan yang sangat sederhana tetapi buang memori adalah memetakan nilai dengan kunci dan melakukan sebaliknya untuk memetakan kunci dengan nilai yang membuat ini:

private Map<Object, Object> team1 = new HashMap<Object, Object>();

Sangat penting bahwa Anda menggunakan <Object, Object>sehingga Anda dapat memetakan keys:Valuedan Value:Keysmenyukai ini

team1.put("United", 5);

team1.put(5, "United");

Jadi, jika Anda menggunakan team1.get("United") = 5danteam1.get(5) = "United"

Tetapi jika Anda menggunakan beberapa metode khusus pada salah satu objek dalam pasangan saya akan lebih baik jika Anda membuat peta lain:

private Map<String, Integer> team1 = new HashMap<String, Integer>();

private Map<Integer, String> team1Keys = new HashMap<Integer, String>();

lalu

team1.put("United", 5);

team1Keys.put(5, "United");

dan ingat, tetap sederhana;)

pengguna3763927
sumber
-3

Untuk mendapatkan Key dan nilainya

misalnya

private Map<String, Integer> team1 = new HashMap<String, Integer>();
  team1.put("United", 5);
  team1.put("Barcelona", 6);
    for (String key:team1.keySet()){
                     System.out.println("Key:" + key +" Value:" + team1.get(key)+" Count:"+Collections.frequency(team1, key));// Get Key and value and count
                }

Akan mencetak: Kunci: United Nilai: 5 Kunci: Barcelona Nilai: 6

Emmanuel R
sumber