比较Map和List以及从List中提取元素

时间:2013-01-24 12:18:09

标签: java collections

我有一个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是==地图的键

我该怎样做并迭代两者?

4 个答案:

答案 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;
        }

    }
}