我有一个Map和一个List My列表,一个值对象的主列表和Map包含值是对象的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是==地图的键
我该怎样做并迭代两者?
答案 0 :(得分: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 :(得分:1)
您可以使用提供的类Map.Entry
而不是类值无论如何,您可以遍历列表并从地图中提取值:
for ( Value v : list ) {
int id = v.getID();
value = valueMap.get(id);
if ( value != null ) {
doSomething( value );
}
}
是你的意思吗?
答案 2 :(得分:1)
那么,您是否希望从列表中获取if等于地图中条目的所有对象?
....
List<Value> subset = ...
for ( int id : map.keySet() ) {
for ( Value v : list ) {
if ( v.id() == id ) {
subset.add( v );
}
}
}
问题是您将为每个键重复列表一次。
你可以通过让id和列表按顺序排列来解决这个问题:
int index = 0;
for ( int id: map.keySet() ) {
while ( index < list.size() && list.get(index).id() == id ) {
subset.add( list.get(index));
index++;
}
}
或者(我会做的)是在找到时从列表中删除元素,这样重新迭代将不那么广泛。
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();
}
}
}
答案 3 :(得分: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;
}
}
}