Nhận khóa từ HashMap trong Java


166

Tôi có một Hashmap trong Java như thế này:

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

Sau đó, tôi điền nó như thế này:

team1.put("United", 5);

Làm thế nào tôi có thể nhận được các phím? Một cái gì đó như: team1.getKey()trả lại "Hoa".


Bạn mong đợi điều gì sẽ team1.getKey()trở lại nếu: (1) bản đồ trống hoặc (2) nếu nó chứa nhiều khóa?
NPE

intnên được sử dụng cho những người duy nhất như thế này.
stommestack

Câu trả lời:


313

A HashMapchứa nhiều hơn một khóa. Bạn có thể sử dụng keySet()để có được bộ tất cả các phím.

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

sẽ lưu trữ 1với chìa khóa "foo"2với chìa khóa "bar". Để lặp lại tất cả các phím:

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

sẽ in "foo""bar".


Nhưng trong trường hợp này tôi chỉ có một khóa cho mỗi giá trị. Không thể viết bất cứ điều gì như team1.getKey ()?
masb

Không có bạn có một bản đồ với một yếu tố. Nhưng đó là bản đồ: một cấu trúc có thể chứa nhiều hơn một yếu tố.
Matteo

13
Điểm của Bản đồ với một phím duy nhất là gì? Tạo một lớp với một trường khóa và một trường giá trị.
JB Nizet

Tôi đã hiểu nhầm vấn đề của tôi. Cảm ơn câu trả lời của bạn.
masb

3
Nếu bạn muốn lưu trữ tất cả các khóa trong danh sách mảng:List<String> keys = new ArrayList<>(mLoginMap.keySet());
Pratik Butani

50

Điều này là có thể làm được, ít nhất là trên lý thuyết, nếu bạn biết chỉ số:

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

keySet() trả về một tập hợp, vì vậy bạn chuyển đổi tập hợp thành một mảng.

Tất nhiên, vấn đề là một bộ không hứa sẽ giữ trật tự của bạn. Nếu bạn chỉ có một mục trong HashMap, bạn vẫn ổn, nhưng nếu bạn có nhiều hơn thế, tốt nhất là lặp lại trên bản đồ, như các câu trả lời khác đã làm.


Điều này hữu ích trong một kịch bản thử nghiệm đơn vị nơi bạn có toàn quyền kiểm soát nội dung của bạn HashMap. Chương trinh hay.
tăngTide

Không có gì về việc biết chỉ số trong câu hỏi.
Hầu tước Lorne

23

Kiểm tra điều này.

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

(Sử dụng java.util.Objects.equalsvì HashMap có thể chứa null)

Sử dụng 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());
}

Càng "chung chung" và càng an toàn càng tốt

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

Hoặc nếu bạn đang ở trên 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
Nhưng điều gì xảy ra nếu một vài khóa ánh xạ tới cùng một giá trị? thay vào đó, bạn nên trả về một danh sách các khóa
Óscar López

@ ÓscarLópez Họ không thể. HashMapchìa khóa là duy nhất.
Hầu tước Lorne

6

Bạn có thể truy xuất tất cả các Mapkhóa của phương thức này bằng phương thức keySet(). Bây giờ, nếu những gì bạn cần là lấy một khóagiá trị của nó , thì đó là một vấn đề hoàn toàn khác vàMap sẽ không giúp bạn ở đó; bạn cần một cấu trúc dữ liệu chuyên biệt, như BidiMap(một bản đồ cho phép tra cứu hai chiều giữa khóa và giá trị) từ Bộ sưu tập Commons của Apache - cũng cần lưu ý rằng một số khóa khác nhau có thể được ánh xạ tới cùng một giá trị.



1

Nếu bạn chỉ cần một cái gì đó đơn giản và nhiều hơn một xác minh.

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

Sau đó, bạn có thể tìm kiếm bất kỳ chìa khóa.

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

1
Phương pháp này là hoàn toàn dư thừa.
Hầu tước 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());
                }

Không hoạt động. Rõ ràng bạn đã không thử nó. Gọi next()hai lần trong vòng lặp có nghĩa là bạn sẽ in các phím được đánh số lẻ cùng với các giá trị được đánh số chẵn.
Hầu tước Lorne

0

Sử dụng hoạt động chức năng để lặp lại nhanh hơn.

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


-1

Một giải pháp có thể là, nếu bạn biết vị trí khóa, chuyển đổi các khóa thành một mảng Chuỗi và trả về giá trị ở vị trí:

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

    return keys[pos];
}

Không có gì về việc biết chỉ số trong câu hỏi.
Hầu tước Lorne

-2

Hãy thử chương trình đơn giản này:

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

Chỉ sao chép các câu trả lời hiện có. -1
james.garriss

-2

Để nhận các khóa trong HashMap, chúng tôi có phương thức keyset () có trong java.util.Hashmapgói. Ví dụ :

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

Bây giờ các khóa sẽ có tất cả các khóa của bạn có sẵn trong bản đồ. ví dụ: [key1, key2]


java,util.HashMaplà một lớp học, không phải là một gói, và không có gì ở đây mà không ở đây năm năm trước.
Hầu tước Lorne

-3

Những gì tôi sẽ làm rất đơn giản nhưng lãng phí bộ nhớ là ánh xạ các giá trị bằng một khóa và thực hiện đối diện để ánh xạ các khóa có giá trị này:

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

Điều quan trọng là bạn sử dụng <Object, Object>để bạn có thể lập bản đồ keys:ValueValue:Keysthích điều này

team1.put("United", 5);

team1.put(5, "United");

Vì vậy, nếu bạn sử dụng team1.get("United") = 5team1.get(5) = "United"

Nhưng nếu bạn sử dụng một số phương pháp cụ thể trên một trong các đối tượng trong các cặp thì tôi sẽ tốt hơn nếu bạn tạo một bản đồ khác:

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

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

và sau đó

team1.put("United", 5);

team1Keys.put(5, "United");

và nhớ, giữ cho nó đơn giản;)


-3

Để lấy Keygiá trị của nó

ví dụ

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
                }

Sẽ in: Key: United Giá trị: 5 Key: Barcelona Giá trị: 6

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.