【问题标题】:How to add prefix to all the elements of List efficiently?如何有效地为 List 的所有元素添加前缀?
【发布时间】:2015-07-29 13:53:36
【问题描述】:

我有一个列表,我需要在列表的所有元素中添加一个前缀。

下面是我通过迭代列表然后添加它的方式。还有其他更好的方法吗?有没有可以做同样事情的一两班轮?

private static final List<DataType> DATA_TYPE = getTypes();

public static LinkedList<String> getData(TypeFlow flow) {
    LinkedList<String> paths = new LinkedList<String>();
    for (DataType current : DATA_TYPE) {
        paths.add(flow.value() + current.value());
    }
    return paths;
}

我需要返回 LinkedList,因为我正在使用 LinkedList 类的一些方法,例如 removeFirst

我现在使用的是 Java 7。

【问题讨论】:

  • 将 Java 8 流与 map 一起使用。
  • 不幸的是,我正在使用 Java 7。

标签: java list collections set


【解决方案1】:

你的实现看起来不错,但如果你想要一些不同的东西,试试这个:

public static List<String> getData(final TypeFlow flow) {
    return new AbstractList<String>() {
        @Override
        public String get(int index) {
            return flow.value()+DATA_TYPE.get(index).value();
        }

        @Override
        public int size() {
            return DATA_TYPE.size();
        }
    };
}

通过这种方式,您可以创建一个“虚拟列表”,它实际上并不包含数据,而是动态计算它。

【讨论】:

  • 这里你的版本和我的版本有什么区别?这里的虚拟列表是什么意思?
  • 它不占用额外的内存,除了 20-30 字节这样的常量。在您开始遍历此列表之前,它不会执行任何字符串连接。您的版本会创建所有前缀字符串并将它们提前存储到内存中,这需要 O(n) 额外内存,其中 n 是 DATA_TYPE 列表大小。在您的情况下,这可能无关紧要,但如果您在 DATA_TYPE 中有数百万个条目,则内存占用可能会有很大差异。
  • 非常有趣的实现!
【解决方案2】:

对于一个衬垫,使用 Java 8 Streams:

List<String> paths = DATA_TYPE.stream().map(c -> flow.value() + c.value()).collect(Collectors.toList());

如果您必须生成LinkedList,则应使用不同的收集器。

【讨论】:

  • 不幸的是,我正在使用 Java 7。
  • @user1950349 在 Java 7 中,您的实现看起来尽可能短。
猜你喜欢
  • 2013-04-15
  • 2018-08-12
  • 2019-09-14
  • 2011-10-14
  • 1970-01-01
  • 1970-01-01
  • 2013-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多