使用Maps.uniqueIndex时如何获取当前索引

时间:2011-02-15 22:50:07

标签: java guava

我们有一个项目列表:List<X> 从此列表中,我们想创建Map<F(X), X>

使用Guava com.google.common.collect, 有Maps.uniqueIndex方法,它将List作为输入和 允许我们将一个函数应用于元素。

这一切都很棒。例如:

List<File> to Map<String, File>

mapOfFileNames = Maps.uniqueIndex(fileList, new Function<File, String>() {
            @Override
            public String apply(@Nullable File input) {
                return input.getName();
            }
        });

我的问题是,我们如何在列表中掌握当前项目(索引)的位置, 使用Maps.uniqueIndex

例如,要转换List<File> to Map<Integer, File> 我希望键是List中File元素的位置。 因此我需要访问当前元素的索引。

你知道这怎么可能吗?

谢谢

1 个答案:

答案 0 :(得分:8)

你为什么要这样做?鉴于您无论如何都可以通过索引在List中进行查找,我真的没有看到它的用处。获取Function中输入项的索引会很浪费,因为您必须为每个项目执行indexOf。如果你真的想这样做,我会说:

List<File> list = ...
Map<Integer, File> map = Maps.newHashMap();
for (int i = 0; i < list.size(); i++) {
  map.put(i, list.get(i));
}

在相关说明中,所有ImmutableCollection都有asList()视图,这可以允许您对任何ImmutableMap进行基于索引的查找。 Maps.uniqueIndex还会保留原始集合中的订单。使用您的示例:

ImmutableMap<String, File> mapOfFileNames = Maps.uniqueIndex(...);
/*
 * The entry containing the file that was at index 5 in the original list
 * and its filename.
 */
Map.Entry<String, File> entry = mapOfFileNames.entrySet().asList().get(5);