2013-01-24 56 views
-1

提取元素我有一個地圖和列表我的列表中的某些值對象的主列表和地圖包含的值對象 我有一個值對象的ID鍵比較地圖和列表,並從列表

public class Value 
{ 


    private int id; 

    private String value; 

//set and gets to follow 
} 

Map valueMap = new HashMap(); 

valueMap.put(1001,"Test1")//key is id of the value object 
valueMap.put(1002,"Test2") 
valueMap.put(1003,"Test3") 


List list = new Array list(); 
list.add(value1) 
list.add(value2) 
list.add(value3) 
list.add(value4) 
list.add(value5) 

從列表中我想提取一個列表的子集,其value.id是==地圖的關鍵字

我該如何做和迭代兩者?

+2

遍歷'List',並要求每個如果* ID *存在作爲'Map'的關鍵。 – MrSmith42

回答

5

您應該使用

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

List<Value> list = new ArrayList<>(); 

然後,你可以做這樣的事情:

List<Value> subset = new ArrayList<>(); 
Iterator<Value> iterator = list.iterator(); 
while (iterator.hasNext()) { 
    Value val = iterator.next(); 
    if (valueMap.containsKey(val.getId())) { 
     subset.add(val); 
    } 
} 

甚至

List<Value> subset = new ArrayList<>(); 
for (Value val : list) { 
    if (valueMap.containsKey(val.getId())) { 
     subset.add(val); 
    } 
} 
1

相反,你可以只使用提供的類Map.Entry的

反正你從地圖上可以遍歷列表,並提取值類值:

for (Value v : list) { 
    int id = v.getID(); 
    value = valueMap.get(id); 

    if (value != null) { 
     doSomething(value); 
    } 
} 

是什麼意思?

1

那麼,你想從列表中獲得所有的對象,如果它等於地圖中的條目?

....

List<Value> subset = ... 
for (int id : map.keySet()) { 
    for (Value v : list) { 
     if (v.id() == id) { 
      subset.add(v); 
     } 
    } 
}  

問題是你會遍歷列表中選擇一個時間,每個鍵。當發現

int index = 0; 
for (int id: map.keySet()) { 
    while (index < list.size() && list.get(index).id() == id) { 
     subset.add(list.get(index)); 
     index++; 
    } 
} 

或(我還能做什麼)是從列表中刪除元素:

您可以通過既有的ID和東西沿線命令鍵和清單解決這個這樣重新迭代將會少一點膨脹。

for(int id : map.keySet()) { 
    for (Iterator<Value> i = list.iterator; i.hasNext();) { 
     Value v = i.next(); 
     if (v.id() == id) { 
      subset.add(v); 
      i.remove(); 
     } 
    } 
} 
0
Here is a full code of what you ask. 

package main; 

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

public class TestMainClass 
{ 

    public static void main(final String[] args) 
    { 
     final Map<Integer, String> map = createDummyMap(); 

     final List<Value> list = createList(); 

     final List<Value> matchedValues = new ArrayList<TestMainClass.Value>(); 

     for (final Value value : list) 
     { 
      for (final Integer id : map.keySet()) 
      { 
       if (id.equals(value.getId())) 
       { 
        matchedValues.add(value); 
       } 
      } 
     } 

     System.out.println(matchedValues.size()); 

    } 

    private static List<Value> createList() 
    { 
     final Value value1 = new Value(1001, "some"); 
     final Value value2 = new Value(1002, "some"); 
     final Value value3 = new Value(1003, "some"); 
     final Value value4 = new Value(1004, "some"); 
     final Value value5 = new Value(1005, "some"); 

     return new ArrayList<TestMainClass.Value>(Arrays.asList(value1, value2, value3, value4, value5)); 
    } 

    private static Map<Integer, String> createDummyMap() 
    { 
     final Map<Integer, String> valueMap = new HashMap<Integer, String>(); 

     valueMap.put(1001, "Test1"); 
     valueMap.put(1002, "Test2"); 
     valueMap.put(1003, "Test3"); 
     return valueMap; 
    } 

    public final static class Value 
    { 
     private int id; 

     private String value; 

     Value(final int id, final String value) 
     { 
      this.id = id; 
      this.value = value; 

     } 

     public int getId() 
     { 
      return id; 
     } 

     public void setId(final int id) 
     { 
      this.id = id; 
     } 

     public String getValue() 
     { 
      return value; 
     } 

     public void setValue(final String value) 
     { 
      this.value = value; 
     } 

    } 
} 
+1

只要考慮您爲列表中的每個項目迭代密鑰集一次。 – OscarRyz

+2

恕我直言,這是一個不好的解決方案,因爲你使用嵌套for循環與'equals()'結合使用。只是循環使用值並在地圖上使用'containsKey()'方法會更有效率。 (看我的答案)。 – jlordo