รับกุญแจจาก HashMap ใน Java


167

ฉันมี Hashmap ใน Java เช่นนี้:

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

จากนั้นฉันก็เติมมันเช่นนี้:

team1.put("United", 5);

ฉันจะรับกุญแจได้อย่างไร สิ่งที่ต้องการ: team1.getKey()เพื่อส่งคืน "ยูไนเต็ด"


คุณคาดหวังสิ่งใดteam1.getKey()หาก: (1) แผนที่ว่างเปล่าหรือ (2) หากมีหลายคีย์
NPE

intควรใช้สำหรับคนโสดเช่นนี้
stommestack

คำตอบ:


313

HashMapมีมากกว่าหนึ่งที่สำคัญ คุณสามารถใช้keySet()เพื่อรับชุดของกุญแจทั้งหมด

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

จะจัดเก็บ1ด้วยกุญแจ"foo"และด้วยกุญแจ2 "bar"ในการทำซ้ำคีย์ทั้งหมด:

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

จะพิมพ์และ"foo""bar"


แต่ในกรณีนี้ฉันมีเพียงคีย์เดียวสำหรับแต่ละค่า ไม่สามารถเขียนอะไรเช่น team1.getKey ()?
masb

ไม่คุณมีแผนที่พร้อมองค์ประกอบเดียว แต่มันเป็นแผนที่: โครงสร้างที่มีมากกว่าหนึ่งองค์ประกอบ
Matteo

13
อะไรคือจุดสำคัญของแผนที่ด้วยปุ่มเดียว? สร้างคลาสที่มีเขตข้อมูลคีย์และเขตข้อมูลค่า
JB Nizet

ฉันเข้าใจผิดปัญหาของฉัน ขอบคุณสำหรับคำตอบของคุณ
masb

3
หากคุณต้องการเก็บคีย์ทั้งหมดในรายการอาเรย์:List<String> keys = new ArrayList<>(mLoginMap.keySet());
Pratik Butani

50

อย่างน้อยก็ในทางทฤษฎีถ้าคุณรู้ดัชนี:

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

keySet() ส่งคืนชุดดังนั้นคุณจึงแปลงชุดเป็นอาร์เรย์

แน่นอนปัญหาคือชุดไม่สัญญาว่าจะรักษาคำสั่งของคุณ หากคุณมีรายการเดียวใน HashMap ของคุณคุณก็ดี แต่ถ้าคุณมีมากกว่านั้นมันเป็นการดีที่สุดที่จะวนลูปแผนที่เหมือนคำตอบอื่น ๆ ที่ทำไปแล้ว


สิ่งนี้มีประโยชน์ในสถานการณ์การทดสอบหน่วยที่คุณสามารถควบคุมเนื้อหาของคุณHashMapได้อย่างเต็มที่ แสดงที่ดี
risingTide

ไม่มีอะไรเกี่ยวกับการรู้ดัชนีในคำถาม
มาร์ควิสแห่ง Lorne

23

ตรวจสอบสิ่งนี้

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

(ใช้java.util.Objects.equalsเพราะ HashMap สามารถมีได้null)

ใช้ 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());
}

เพิ่มเติม "ทั่วไป" และปลอดภัยที่สุด

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

หรือถ้าคุณอยู่บน 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;
}

2
แต่จะเกิดอะไรขึ้นถ้าหลาย ๆ คีย์แมปกับค่าเดียวกัน? คุณควรส่งคืนรายการกุญแจแทน
--scar López

@ ÓscarLópezพวกเขาทำไม่ได้ HashMapกุญแจเป็นเอกลักษณ์
มาร์ควิสแห่ง Lorne

6

คุณสามารถดึงข้อมูลทั้งหมดของMapปุ่ม 's keySet()โดยใช้วิธีการ ทีนี้ถ้าสิ่งที่คุณต้องการคือการได้รับกุญแจที่ให้คุณค่ามันเป็นเรื่องที่แตกต่างอย่างสิ้นเชิงและMapจะไม่ช่วยคุณ คุณต้องการโครงสร้างข้อมูลเฉพาะเช่นBidiMap(แผนที่ที่อนุญาตให้ค้นหาสองทิศทางระหว่างคีย์และค่า) จากชุดคอมมอนส์ของ Apache - โปรดทราบว่าอาจมีการแมปคีย์ที่แตกต่างกันหลายค่าเป็นค่าเดียวกัน



1

หากคุณต้องการสิ่งที่เรียบง่ายและมากกว่าการตรวจสอบ

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

จากนั้นคุณสามารถค้นหาคีย์ใด ๆ

System.out.println( "Does this key exist? : " + getKey("United") );

1
วิธีนี้ซ้ำซ้อนกันโดยสิ้นเชิง
มาร์ควิสแห่ง 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());
                }

ใช้งานไม่ได้ เห็นได้ชัดว่าคุณยังไม่ได้ลอง การโทรnext()สองครั้งในลูปหมายความว่าคุณจะพิมพ์คีย์เลขคี่พร้อมกับค่าเลขคู่
มาร์ควิสแห่ง Lorne

0

ใช้ฟังก์ชั่นการทำงานเพื่อการวนซ้ำที่เร็วขึ้น

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


-1

วิธีแก้ปัญหาคือหากคุณทราบตำแหน่งคีย์ให้แปลงคีย์เป็นอาร์เรย์สตริงและส่งคืนค่าในตำแหน่ง:

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

    return keys[pos];
}

ไม่มีอะไรเกี่ยวกับการรู้ดัชนีในคำถาม
มาร์ควิสแห่ง Lorne

-2

ลองใช้โปรแกรมอย่างง่ายนี้:

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

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

เพียงคัดลอกคำตอบที่มีอยู่ -1
james.garriss

-2

เพื่อรับกุญแจใน HashMap เรามีวิธี keySet () ซึ่งมีอยู่ในjava.util.Hashmapแพ็คเกจ เช่น

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

ตอนนี้ปุ่มจะมีปุ่มทั้งหมดของคุณในแผนที่ เช่น: [key1, key2]


java,util.HashMapเป็นคลาสไม่ใช่แพ็คเกจและไม่มีอะไรที่นี่ที่ไม่ได้อยู่ที่นี่เมื่อห้าปีก่อน
มาร์ควิสแห่งลอร์น

-3

สิ่งที่ฉันจะทำซึ่งง่ายมาก แต่หน่วยความจำเสียคือการแมปค่าด้วยคีย์และทำ oposite เพื่อแมปคีย์ด้วยค่าที่ทำสิ่งนี้:

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

เป็นสิ่งสำคัญที่คุณต้องใช้<Object, Object>เพื่อให้คุณสามารถแมปkeys:ValueและValue:Keysแบบนี้ได้

team1.put("United", 5);

team1.put(5, "United");

ดังนั้นหากคุณใช้ team1.get("United") = 5และteam1.get(5) = "United"

แต่ถ้าคุณใช้วิธีการเฉพาะกับวัตถุหนึ่งในคู่ฉันจะดีกว่าถ้าคุณทำแผนที่อื่น:

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

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

แล้ว

team1.put("United", 5);

team1Keys.put(5, "United");

และจำไว้ให้ง่าย;)


-3

เพื่อรับKeyและค่าของมัน

เช่น

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
                }

จะพิมพ์:คีย์: ค่าสห: 5 รหัส: บาร์เซโลนาค่า: 6

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.