将List <t>转换为带有元素列表的Map(Map <f <t>,List <t>&gt;)Java 7

时间:2016-02-23 03:06:41

标签: java list dictionary guava

我找到了转换List<Object> to a Map<Integer, Object>的方法,但我需要

List<Object> to Map<Integer, List<Object>

例如我有课

class Movie {
   public int rank;
   public String desc;

   public Movie(int rank, String desc) {
        this.rank = rank;
        this.desc = desc;
   }
}

并列出:

    List<Movie> movies = new ArrayList<Movie>();
    movies.add(new Movie(1, "The Movie 0"));
    movies.add(new Movie(2, "The Movie 1"));
    movies.add(new Movie(2, "The Movie 2"));

我想要的是每个等级的列表地图..

List<Movie> -> Map<Integer (rank), List<Movie>>

使用Guava我可以像这样进行简单的转换

Map<Integer,Movie> mappedMovies = Maps.uniqueIndex(movies, new Function <Movie,Integer> () {
    public Integer apply(Movie from) {
        return from.getRank(); 
}});

但不是Map<Integer, List<Movie>>

我只能在关于它的帖子上找到

Java: how to transform from List<T> to Map<f1(T), List(f2(T))> without iterating

然而,一种方法是使用Java 8,第二种方法出于某种原因返回ListMultimap<Integer, String>

2 个答案:

答案 0 :(得分:5)

您提到的第二种方法是您想要的。作为Kiskae commented,“ListMultimap<K,V>基本上是Map<K,List<V>>,可以为您管理列表的创建。”

因此,您可以使用Multimaps.index(Iterable, Function)Multimaps.asMap(ListMultimap)获取Map<F<T>, List<T>>

ImmutableListMultimap<Integer, Movie> index = Multimaps.index(movies, new Function<Movie, Integer>() {
    @Override
    public Integer apply(Movie from) {
        return from.getRank();
    }
});
Map<Integer, List<Movie>> map = Multimaps.asMap(index);

虽然您可以使用Multimaps.asMap(ListMultimap),但直接使用Multimap可能会更容易。有关详细信息,请参阅MultimapNewCollectionTypesExplained · google/guava Wiki部分。

答案 1 :(得分:0)

最简单的方法就是拥有自己的“添加”功能:

$("#symbol_id").find("#g_id").attr('fill', "#colorOfChoice");