迭代除第一个元素之外的List的首选方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迭代除第一个元素之外的List的首选方法相关的知识,希望对你有一定的参考价值。

我经常需要从第二个元素开始遍历List。例如,这是一列:

List<String> column = Arrays.asList("HEADER", "value1", "value2", "value3");

我只需要打印值。

我看到三种方法:

  1. 使用子列表: for (String s : column.subList(1, column.size())) { System.out.println(s); }
  2. УсинЛиститертор yaazkssvpoi
  3. 使用索引 for (ListIterator<String> iter = column.listIterator(1); iter.hasNext(); ) { System.out.println(iter.next()); }

考虑可读性,最佳实践和性能,最受欢迎的是什么?

在我看来,子列表解决方案更具可读性,但我很少在实践中看到它。与索引解决方案相比,它有任何重大缺陷吗?

答案

这真的归结为(几乎)“个人风格”。

您应该选择最适合您/您的团队的方法。

选项3似乎是带有最少开销的选项 - 选项1和2都创建新的“中间”对象(子列表和迭代器)。而且确切地说:for (int i = 1; i < column.size(); i++) { System.out.println(column.get(i)); } 没有创建新的列表并填充它 - 它归结为一个新的sublist()对象,它只是“知道”更大的父列表中的边界。

但是:只要我们考虑不支持对列表元素的随机访问的列表(例如,想想链接列表),那么与其他元素相比,选项3会导致很多性能成本。

另一答案

如果您使用Java 8或更高版本,则可以使用:

Sublist
另一答案

这更多的是个人喜好。 column.stream().skip(1).forEach((c) -> System.out.println(c)) 方法不返回新对象,只返回当前列表顶部的视图,因此它没有任何内存开销。我认为可读性是决定这一点的唯一标准,最后一个选项是最易读的解决方案,不需要调用任何额外的方法(例如迭代器,子列表等)

以上是关于迭代除第一个元素之外的List的首选方法的主要内容,如果未能解决你的问题,请参考以下文章

选择除第一个之外的所有“tr”

使用纯 css 隐藏除第一个元素之外的所有元素

样式化除第一个选定元素之外的所有元素? [复制]

选择除第一个之外的所有子元素

有没有办法为“除第一个/最后一个之外的所有元素”指定CSS简写?

c# list移除第0个元素后面会自动往前移吗?