2011-11-13 44 views
26

Tôi muốn lấy khóa của HashMap bằng giá trị.Lấy khóa từ HashMap bằng cách sử dụng giá trị

hashmap = new HashMap<String, Object>(); 

haspmap.put("one", 100); 
haspmap.put("two", 200); 

Có nghĩa là tôi muốn một hàm sẽ lấy giá trị 100 và sẽ trả về chuỗi giá trị.

Có vẻ như có rất nhiều câu hỏi ở đây yêu cầu điều tương tự nhưng chúng không hoạt động đối với tôi.

Có thể vì tôi mới sử dụng java.

Cách thực hiện?

+0

100 là giá trị và không phải là một chìa khóa. Bạn phải trao đổi "một" và 100 và cứ thế hoặc bạn cần một BiMap. Đầu tiên arg là khóa và arg thứ hai là giá trị. –

+0

@Fatal thời gian tiếp theo cung cấp đó là một câu trả lời;) Bạn đã nhanh hơn tôi 10 giây. – Bozho

+0

@Bozho Tôi sẽ làm như vậy lần sau. :-) –

Trả lời

62

Phương pháp đặt trong HashMap được định nghĩa như thế này:

Object put(Object key, Object value) 

quan trọng là tham số đầu tiên, vì vậy trong đặt của bạn, "một" là chìa khóa. Bạn không thể dễ dàng tìm kiếm theo giá trị trong một HashMap, nếu bạn thực sự muốn làm điều đó, nó sẽ là một tìm kiếm tuyến tính được thực hiện bằng cách gọi entrySet(), như thế này:

for (Map.Entry<Object, Object> e : hashmap.entrySet()) { 
    Object key = e.getKey(); 
    Object value = e.getValue(); 
} 

Tuy nhiên, đó là O (n) và loại đánh bại mục đích sử dụng HashMap trừ khi bạn chỉ cần làm điều đó hiếm khi. Nếu bạn thực sự muốn có thể tra cứu bằng khóa hoặc giá trị thường xuyên, Java lõi không có gì cho bạn, nhưng một cái gì đó như BiMap từ Google Collections là những gì bạn muốn.

+0

Điều này sẽ chỉ chạy trong khi gỡ lỗi vì vậy thời gian chạy không phải là một vấn đề. – kechapito

+1

+1, mặc dù tôi tìm thấy lặp qua mục nhập được đặt đơn giản hơn một chút vì nó chứa giá trị trong phần tử. Tuy nhiên, nếu không có BiMap thì OP cần duy trì các giá trị "giá trị duy nhất" bất biến bên ngoài bản đồ. –

+0

@MarkPeters: Cảm ơn. Tôi muốn làm điều đó nhưng những ngón tay của tôi không hợp tác. entrySet là hiệu quả hơn vì bạn không cần phải làm tra cứu cho mỗi lần lặp của keySet. – kbyrd

4

Bạn đã hoàn tác. 100 phải là tham số đầu tiên (đó là khóa) và tham số "một" phải là thông số thứ hai (đó là giá trị).

Đọc javadoc cho HashMap và có thể giúp bạn: HashMap

Để có được giá trị, sử dụng hashmap.get(100).

+0

Ops tôi đã viết nó đảo ngược. Tôi sẽ sửa nó. – kechapito

5
  • Nếu bạn cần chỉ đó, chỉ cần sử dụng put(100, "one"). Lưu ý rằng khóa là đối số đầu tiên và giá trị là số 2.
  • Nếu bạn cần để có thể nhận được bằng cả hai chìa khóa và giá trị, sử dụng BiMap (từ ổi)
0

nếu bạn biết những gì để có được "ONE" bằng cách cho vào 100 sau đó

khởi băm bản đồ bằng cách

hashmap = new HashMap<Object,String>();

haspmap.put(100,"one");

và lấy giá trị bằng hashMap.get(100)

hy vọng điều đó sẽ hữu ích.

+0

Không thực sự gây ra tôi đã thực hiện bản đồ này như thế này để cung cấp cho chuỗi và trả về giá trị. Bây giờ tôi cần phải đối diện để gỡ lỗi. – kechapito

4

Bạn đã trộn lẫn các khóa và giá trị.

Hashmap <Integer,String> hashmap = new HashMap<Integer, String>(); 

hashmap.put(100, "one"); 
hashmap.put(200, "two"); 

Sau đó một

hashmap.get(100); 

sẽ cung cấp cho bạn "một"

+0

Bạn không chắc chắn tại sao bạn bị bỏ phiếu .... Có vẻ như đó là một sai lầm chính đáng của OP. @AHungerArtist thậm chí còn nói rằng anh ta đã đảo ngược nó trong các bình luận bên dưới. – jww

1
public class Class1 { 
private String extref="MY"; 

public String getExtref() { 
    return extref; 
} 

public String setExtref(String extref) { 
    return this.extref = extref; 
} 

public static void main(String[] args) { 

    Class1 obj=new Class1(); 
    String value=obj.setExtref("AFF"); 
    int returnedValue=getMethod(value);  
    System.out.println(returnedValue); 
} 

/** 
* @param value 
* @return 
*/ 
private static int getMethod(String value) { 
     HashMap<Integer, String> hashmap1 = new HashMap<Integer, String>(); 
     hashmap1.put(1,"MY"); 
     hashmap1.put(2,"AFF"); 

     if (hashmap1.containsValue(value)) 
     { 
      for (Map.Entry<Integer,String> e : hashmap1.entrySet()) { 
       Integer key = e.getKey(); 
       Object value2 = e.getValue(); 
       if ((value2.toString()).equalsIgnoreCase(value)) 
       { 
        return key; 
       } 
      } 
     } 
     return 0; 

} 
} 
+0

Mã đơn giản không phải là câu trả lời. Bạn phải giải thích. – EJP

23

Chúng tôi có thể nhận KEY từ VALUE. Bên dưới là mẫu mã_

public class Main { 
    public static void main(String[] args) { 
    Map map = new HashMap(); 
    map.put("key_1","one"); 
    map.put("key_2","two"); 
    map.put("key_3","three"); 
    map.put("key_4","four");
System.out.println(getKeyFromValue(map,"four")); } public static Object getKeyFromValue(Map hm, Object value) { for (Object o : hm.keySet()) { if (hm.get(o).equals(value)) { return o; } } return null; } }

Tôi hy vọng điều này sẽ giúp mọi người.

+1

Điều này tốt hơn câu trả lời được chấp nhận. –

+1

Phương pháp nhỏ bé rạng ngời - đã làm việc một điều trị cho những gì tôi cần - Tôi sẽ sử dụng tốt ví dụ này trong những năm tới tôi nghĩ. – thonnor

Các vấn đề liên quan