2012-10-18 62 views
25

Ngày tốt, điều này làm tôi bối rối ngay bây giờ (đóng băng não!) Và dường như thiếu một cái gì đó. Có một ArrayList mà tôi cư trú với một HashMap. bây giờ tôi đặt trong HashMap và arraylist của tôi.Lấy tất cả các giá trị từ các khóa HashMap trong một ArrayList Java

Map.put(DATE, value1); 
Map.put(VALUE, value2); 

arraylist.put(Map); 

Vì đang phân tích cú pháp JSON, danh sách mảng sẽ tăng kích thước đáng kể. bây giờ câu hỏi của tôi là làm thế nào để bạn nhận được các giá trị từ cả hai khóa bản đồ trong arraylist? tôi đã thử điều này

if(!list.isEmpty()){ // list is an ArrayList 

      for(int k = 0; k < list.size(); k++){ 
       map = (HashMap)list.get(k); 
      } 

     } 

     Log.d(TAG, "map size is" + map.size()); 

     String [] keys = new String[map.size()]; 
     String [] date_value = new String[map.size()]; 

     String [] value_values = new String[map.size()]; 

     int i = 0; 
     Set entries = map.entrySet(); 
     Iterator iterator = entries.iterator(); 

     while(iterator.hasNext()){ 

      Map.Entry mapping = (Map.Entry)iterator.next(); 
      keys[i] = mapping.getKey().toString(); 
      date_value[i] = map.get(keys[i]); 

      if(keys[i].equals(DATE)){ 
       date_value[i] = map.get(keys[i]); 

      } else if(keys[i].equals(VALUE)){ 
       value_values[i] = map.get(keys[i]); 
      } 

        i++; 
       } 

Nhưng tôi dường như không thể có được tất cả các giá trị. Kích thước bản đồ luôn trả về giá trị là 2, chỉ là các phần tử. làm thế nào tôi có thể nhận được tất cả các giá trị từ các phím Map trong ArrayList? Cảm ơn

+0

nếu bạn đang muốn các phím từ cả hai bản đồ, bạn sẽ cần phải thực sự GET các phím từ cả hai bản đồ. mã của bạn chỉ nhận các khóa từ bản đồ cuối cùng trong danh sách. – toadzky

Trả lời

70

Tại sao bạn muốn phát minh lại bánh xe, khi bạn đã có thứ gì đó để thực hiện công việc của mình. Phương pháp Map.keySet() cung cấp cho bạn một Tập hợp tất cả các phím trong Bản đồ.

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

for (String key: map.keySet()) { 
    System.out.println("key : " + key); 
    System.out.println("value : " + map.get(key)); 
} 

Ngoài ra, 1 bạn cho vòng trông lạ với tôi: -

for(int k = 0; k < list.size(); k++){ 
      map = (HashMap)list.get(k); 
    } 

Bạn đang iterating trên danh sách của bạn, và gán mỗi phần tử với cùng reference - map, mà sẽ ghi đè tất cả các giá trị trước .. Tất cả những gì bạn sẽ có là bản đồ cuối cùng trong danh sách của bạn.

EDIT: -

Bạn cũng có thể sử dụng entrySet nếu bạn muốn cả hai quan trọng và giá trị so với bản đồ của bạn. Điều đó sẽ tốt hơn cho bạn: -

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

    for(Entry<String, Integer> entry: map.entrySet()) { 
     System.out.println(entry.getKey()); 
     System.out.println(entry.getValue()); 
    } 

P.S.: -
Mã của bạn có vẻ lộn xộn với tôi. Tôi khuyên bạn nên giữ mã đó sang một bên và suy nghĩ về số design một lần nữa. Bây giờ, như mã viết tắt, rất khó để hiểu những gì nó đang cố gắng làm.

+2

'entrySet' là cách tốt hơn để lặp lại các phần tử trong bản đồ nếu mã trong vòng lặp gọi là 'get' –

+0

@JohnB Yeah, tốt hơn trong trường hợp này là .. –

+0

@RohitJain xin lỗi vì đã trả lời quá muộn, didn' t có một cơ hội sau khi đăng câu hỏi. những gì đang cố gắng làm là lấy tất cả các giá trị từ bản đồ. Như tôi đã nói trong bài viết, Hashmap có 2 khóa được điền thông qua một phân tích JSON và sau đó được thêm vào một ArrayList. Tôi muốn lấy tất cả các giá trị cho 2 khóa trong HashMap, nằm bên trong ArrayList. Có, tôi biết vòng lặp "for" đầu tiên trông kỳ lạ. nhưng tôi đã cố gắng để có được tất cả các giá trị trong Arraylist bởi vì Hashmap đã trở về chỉ có một kích thước của 2 giá trị và có nhiều hơn trong ArrayList. – irobotxxx

1

Đặt i ++ ở đâu đó vào cuối vòng lặp của bạn.

Trong đoạn mã trên, vị trí 0 của mảng bị ghi đè bởi vì tôi không được tăng lên trong mỗi vòng lặp.

FYI: dưới đây được thực hiện một tìm kiếm dự phòng:

if(keys[i].equals(DATE)){     
    date_value[i] = map.get(keys[i]);    
} else if(keys[i].equals(VALUE)){    
    value_values[i] = map.get(keys[i]);    
} 

thay thế với

if(keys[i].equals(DATE)){     
    date_value[i] = mapping.getValue(); 
} else if(keys[i].equals(VALUE)){    
    value_values[i] = mapping.getValue() 
} 

Một vấn đề khác là bạn đang sử dụng i cho date_valuevalue_values. Điều này là không hợp lệ trừ khi bạn có ý định có giá trị null trong mảng của bạn.

+0

Chăm sóc downvoter để bình luận? trong đoạn mã trên, vị trí 0 của mảng bị ghi đè bởi vì tôi không được tăng lên. –

+0

anh ấy không đăng mã nơi tôi được khai báo. nếu nó ở trong vòng lặp, nó có thể đã được tăng lên. bạn không biết chuyện gì đang xảy ra với 'tôi' bởi vì anh ta không đăng bất cứ điều gì về 'tôi'. – toadzky

+0

@toadzky kiểm tra lại bài đăng. Tìm kiếm 'int i = 0;'. Ông DID đăng mã nơi 'i' được khai báo. –

9

Hãy thử theo cách này ...

tôi đang xem xét các HashMap với chínhgiá trị loại String, HashMap<String,String>

HashMap<String,String> hmap = new HashMap<String,String>(); 

hmap.put("key1","Val1"); 
hmap.put("key2","Val2"); 

ArrayList<String> arList = new ArrayList<String>(); 

for(Map.Entry<String,String> map : hmap.entrySet()){ 

    arList.add(map.getValue()); 

} 
+0

@KumarVivekMitra .. Hãy xem lại 'ArrayList' của bạn một lần nữa .. –

+0

Yeah thats fine now. Nhưng tại sao bạn lại thêm tất cả giá trị bản đồ vào danh sách? Nó thực sự là neede? Tôi nghĩ không có. Bất cứ khi nào bạn muốn có một giá trị, bạn có thể lấy nó từ Bản đồ .. Hiện tại, rất không rõ ràng, những gì OP muốn làm. –

+0

@RohitJain Tôi đã thêm giá trị trong ArrayList như OP muốn nó theo cách này..và đó là tiêu đề của câu hỏi cho biết .... –

1

Đây là cực kỳ cũ, nhưng tôi stumbled trên nó cố gắng tìm một câu trả lời cho một câu hỏi khác nhau.

câu hỏi của tôi là làm thế nào để bạn nhận được các giá trị từ cả hai khóa bản đồ trong danh sách mảng?

for (String key : map.keyset()) { 
    list.add(key + "|" + map.get(key)); 
} 

kích thước Map luôn trả về giá trị 2, mà chỉ là những yếu tố

Tôi nghĩ rằng bạn có thể bị nhầm lẫn bởi các chức năng của HashMap. HashMap chỉ cho phép 1 đến 1 các mối quan hệ trên bản đồ.

Ví dụ, nếu bạn có:

String TAG_FOO = "FOO"; 
String TAG_BAR = "BAR"; 

và cố gắng để làm một cái gì đó như thế này:

ArrayList<String> bars = ArrayList<>("bar","Bar","bAr","baR"); 
HashMap<String,String> map = new HashMap<>(); 
for (String bar : bars) { 
    map.put(TAG_BAR, bar); 
} 

Mã này sẽ kết thúc thiết lập mục chính "BAR" được liên kết với mục cuối cùng trong danh sách bars.

Trong ví dụ của bạn, bạn có vẻ nhầm lẫn rằng chỉ có hai mục, nhưng bạn chỉ có hai khóa được ghi dẫn tôi tin rằng bạn đã ghi đè lên trường của mỗi khóa nhiều lần.

0

Giả sử tôi có HashMap với datatype chủ chốt như KeyDataType và giá trị kiểu dữ liệu như ValueDataType

HashMap<KeyDataType,ValueDataType> list; 

Thêm tất cả các mục mà bạn cần đến nó. Bây giờ bạn có thể thử lại tất cả các khóa băm trong danh sách.

KeyDataType[] mKeys; 
mKeys=list.keySet().toArray(new KeyDataType[list.size()]); 

Vì vậy, bây giờ bạn có tất cả các phím của bạn trong một mkeys mảng []

bây giờ bạn có thể lấy bất kỳ giá trị bằng cách gọi

list.get(mkeys[position]); 
Các vấn đề liên quan