List 在Java中将对象列表转换为hashmap

List 在Java中将对象列表转换为hashmap,list,hashmap,List,Hashmap,我有一个java列表,每个对象都是一个字符串,包含一个字符串和一个整数。我无法控制列表,因为它是由API方法返回的 我想把这张单子放到地图上。执行此操作的最佳方法是什么?在列表上循环并将其存储到新地图中: Map<String, Integer> result = new HashMap<String, Integer>(); for(Map<String,Integer> item : list){ result.putAll

我有一个java
列表
,每个对象都是一个字符串,包含一个字符串和一个整数。我无法控制列表,因为它是由API方法返回的


我想把这张单子放到地图上。执行此操作的最佳方法是什么?

在列表上循环并将其存储到新地图中:

    Map<String, Integer> result = new HashMap<String, Integer>();
    for(Map<String,Integer> item : list){
        result.putAll(item);
    }
Map result=newhashmap();
用于(映射项:列表){
结果:putAll(项目);
}

请注意,如果列表中有多个项目具有相同的字符串键,则它们将在地图中相互覆盖。

在列表上循环并将其存储到新地图中:

    Map<String, Integer> result = new HashMap<String, Integer>();
    for(Map<String,Integer> item : list){
        result.putAll(item);
    }
Map result=newhashmap();
用于(映射项:列表){
结果:putAll(项目);
}

请注意,如果列表中有多个项目具有相同的字符串键,则它们将在映射中相互覆盖。

创建一个您喜欢的类型的映射(HashMap、TreeMap、HashTable等),然后遍历列表并逐个添加所有元素

没有更好的方法了(除非你愿意编写你自己的地图,它由这个列表支持,在某些情况下,这会非常好)

在添加元素之前,您可以在地图类型上设置一些选项(例如设置大小),因为您已经知道要添加多少元素。这可能会稍微提高性能。很大程度上取决于您的用例


编辑:我这么说是因为我理解你的问题,你的列表包含一个字符串和一个整数属性的POJO。如果这是不同的,那么答案可能是不同的。

创建一个您喜欢的类型的映射(HashMap、TreeMap、HashTable等等),然后遍历列表并逐个添加所有元素

没有更好的方法了(除非你愿意编写你自己的地图,它由这个列表支持,在某些情况下,这会非常好)

在添加元素之前,您可以在地图类型上设置一些选项(例如设置大小),因为您已经知道要添加多少元素。这可能会稍微提高性能。很大程度上取决于您的用例


编辑:我这么说是因为我理解你的问题,你的列表包含一个字符串和一个整数属性的POJO。如果这是不同的,那么答案可能是不同的。

不确定你所说的对象是什么意思,但是如果这是一张地图,下面是代码:

Map<String,Integer> map=new Hasmap<String, Integer>();
for(Object o:list){
  Map<String,Integer> m=(Map<String,Integer>)o
  map.putAll(m)
}
Map Map=new Hasmap();
用于(对象o:列表){
映射m=(映射)o
putAll地图(m)
}

键覆盖可能会丢失数据,但不确定对象是
的意思,但如果这是一个映射,则代码如下:

Map<String,Integer> map=new Hasmap<String, Integer>();
for(Object o:list){
  Map<String,Integer> m=(Map<String,Integer>)o
  map.putAll(m)
}
Map Map=new Hasmap();
用于(对象o:列表){
映射m=(映射)o
putAll地图(m)
}
通过“强制转换”键覆盖可能会丢失数据,也就是说,除非API返回的对象也实现Map(显然不是这样),否则将列表视为另一种类型的东西是不起作用的。但您可以使用列表的内容创建地图

此外:列表不能包含
,因为列表只包含一种类型的对象。我想,它包含这样一个对象:

public class Element {
  public String key;
  public Integer value;
}
对于这些事情,显而易见的解决方案是:

Map<String, Integer> map = new HashMap<String, Integer>(list.size()); // the size of the map will be the size of the list.
for(Element e: list) {
  map.put(e.key, e.value);
}
Map Map=newhashmap(list.size());//地图的大小将是列表的大小。
对于(元素e:列表){
map.put(e.key,e.value);
}
如果列表及其条目以后都不会更改,那么这就足够了。如果有什么东西可以改变,那么你必须实现你自己的地图,对列表进行即时翻译。根据更改的内容,这或多或少会比较复杂,但如果所有内容都会发生更改,则可以创建一个新类,将列表转换为地图:

class ListTranslatorMap extends AbstractMap<String, Integer> {

  private List<Element> list;

  public ListTranslatorMap(List<Element> list) {
    this.list = list;
  }

  public Set<Map.Entry<String, Integer>> entrySet() {
    return new AbstractSet<Map.Entry<String, Integer>>() {
      public int size() {
        return list.size();
      }

      public Iterator<Map.Entry<String, Integer>> iterator() {
        final Iterator<Element> listIterator = list.iterator();
        return new Iterator<Map.Entry<String, Integer>>() {
          public boolean hasNext() {
            return listIterator.hasNext();
          }

          public void remove() {
            listIterator.remove();
          }

          public Map.Entry<String, Integer> next() {
            final Element element = listIterator.next();
            return new Map.Entry<String, Integer>() {
              public String getKey() {
                return element.key;
              }
              public Integer getValue() {
                return element.value;
              }
              public Integer setValue(Integer value) {
                Integer prev = element.value;
                element.value = value;
                return prev;
              }
            };
          }
        };
      }
    };
  }

}
类ListTranslatorMap扩展了AbstractMap{
私人名单;
公共列表TranslatorMap(列表){
this.list=列表;
}
公共集入口集(){
返回新的AbstractSet(){
公共整数大小(){
返回list.size();
}
公共迭代器迭代器(){
最终迭代器listIterator=list.Iterator();
返回新的迭代器(){
公共布尔hasNext(){
返回listIterator.hasNext();
}
公共空间删除(){
remove();
}
publicmap.Entry next(){
最终元素=listIterator.next();
返回新的Map.Entry(){
公共字符串getKey(){
返回元素.key;
}
公共整数getValue(){
返回元素.value;
}
公共整数设置值(整数值){
整数prev=element.value;
元素值=值;
返回上一个;
}
};
}
};
}
};
}
}
但通常情况下,这会有点过分,简单的循环转换就足够了。如果您需要更多处理映射的方法(或者如果它不是一个映射,而是一个具有一个键和多个条目的多映射),那么请查看在中具有方便索引函数的库。

“Casting”,即,除非API返回的对象也实现了映射,否则将列表视为另一种类型的东西将不起作用(显然不是这样),但是你可以用列表的内容创建一个地图

此外:列表不能包含
,因为列表只包含一种类型的对象。我想,它包含这样一个对象:

public class Element {
  public String key;
  public Integer value;
}
对于这些事情,显而易见的解决方案是:

Map<String, Integer> map = new HashMap<String, Integer>(list.size()); // the size of the map will be the size of the list.
for(Element e: list) {
  map.put(e.key, e.value);
}
Map Map=newhashmap(list.size());//映射的大小将是列表的大小。
对于(元素e:列表){
map.put(e.key,e.value);
}
如果列表及其条目以后都不会更改,那么这就足够了。如果某些内容可以更改,那么您必须实现自己的映射,该映射可以对列表进行即时翻译。根据更改的内容,这或多或少会比较复杂,但我