-1

我有一个 Map 和一个 List 我的列表是一些值对象的主列表,并且 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 是 ==map 的键

我该如何做和迭代两者?

4

4 回答 4

6

你应该使用

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);
    }
}
于 2013-01-24T12:23:37.063 回答
1

您可以只使用提供的类 Map.Entry 而不是类值

无论如何,您可以遍历列表并从地图中提取值:

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

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

你是这个意思吗?

于 2013-01-24T12:26:45.003 回答
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();
      }
   }
 }
于 2013-01-24T12:29:56.390 回答
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;
        }

    }
}
于 2013-01-24T12:38:23.180 回答