java.util.List 的降序迭代器

2024-03-22

链表可以使用升序或降序迭代器进行迭代,如下所示:

LinkedList<Object> list = new LinkedList<Object>();
   ...
StringJoiner sJ1 = new StringJoiner(" ");
list.iterator().forEachRemaining(a -> sJ1.add(a.toString()));
System.out.println("averse: \n" + sJ1.toString());

StringJoiner sJ2 = new StringJoiner(" ");
list.descendingIterator().forEachRemaining(a -> sJ2.add(a.toString()));
System.out.println("reverse: \n" + sJ2.toString());
averse: 
Hello 2 Chocolate 10
reverse: 
10 Chocolate 2 Hello

But 降序迭代器不适用于List and 数组列表。 是否有任何解决方法或列表解释,为什么降序迭代器不存在于List?

问题类似于java中的foreach循环可以逆序执行吗? https://stackoverflow.com/questions/1098117/can-one-do-a-for-each-loop-in-java-in-reverse-order。但所有答案都推荐临时解决方案或第三方库。

可能有可能使用流流吗? (不幸的是,我的谷歌搜索仅给出了流的缺少标准反向Java 8 流逆序 https://stackoverflow.com/questions/24010109/java-8-stream-reverse-order)

正如我所提到的,我的问题与流有关,但是:

  • 使用流只是一种选择,问题是java.util.Iterator https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html and java.util.List https://docs.oracle.com/javase/8/docs/api/java/util/List.html
  • 该问题的答案仅解决了部分情况,但表明缺乏方便的一般逆向。如果我没有遗漏术语“列表”是有序集合,对可比较项目进行排序,以实现顺序缩小范围。

没有什么充分的理由List不能有降序迭代器。每一个List需要支持一个ListIterator可以使用相反的顺序迭代hasPrevious() and previous()方法。不过,这似乎是一个相当不常见的用例。

这是一个小实用方法,可以适应Iterable to a ListIterator以相反顺序迭代:

static <T> Iterable<T> descendingIterable(List<? extends T> list) {
    return () -> {
        ListIterator<? extends T> li = list.listIterator(list.size());
        return new Iterator<T>() {
            public boolean hasNext() { return li.hasPrevious(); }
            public T next() { return li.previous(); }
        };
    };
}

您可以使用它来实现您的示例:

List<String> list = Arrays.asList("Hello", "2", "Chocolate", "10");
StringJoiner sj = new StringJoiner(" ");
descendingIterable(list).iterator().forEachRemaining(sj::add);
System.out.println(sj);

10 Chocolate 2 Hello

或者您可以在增强的 for 循环中使用它:

for (String s : descendingIterable(list)) {
    System.out.println(s);
}

10
Chocolate
2
Hello

我最初让这个创建了一个Iterator而不是Iterable,但后者更有用,因为它可以在增强的 for 循环中使用。

还要注意这里有一个小问题,那就是如果List可以同时修改。这发生在此处的代码中:

list.listIterator(list.size())

如果可能,您必须在列表上使用外部同步,或者如果列表是CopyOnWriteArrayList,你必须先克隆它。看这个答案 https://stackoverflow.com/a/42046731/1441122有关后者的更多信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java.util.List 的降序迭代器 的相关文章

  • 声纳违规:安全性 - 使用 byte[] 时直接存储数组

    我确实遇到过以下两篇关于类似问题的帖子声纳违规 https stackoverflow com questions 11580948 sonar violation security array is stored directly and
  • java.sql.SQLException: ORA-01005: 给定的密码为空;登录被拒绝

    我在尝试连接到数据库时遇到以下异常 java sql SQLException ORA 01005 null password given logon denied at oracle jdbc driver T4CTTIoer proce
  • Jackson Json 将对象反序列化为列表

    我正在使用 Spring 的 Web 服务RestTemplate并反序列化Jackson 在来自服务器的 JSON 响应中 其中一个字段可以是对象或列表 这意味着它可以是 result or result 有没有办法通过对我要反序列化的类
  • 无法从 TemporalAccessor 获取 OffsetDateTime

    当我这样做时 String datum 20130419233512 DateTimeFormatter formatter DateTimeFormatter ofPattern yyyyMMddHHmmss withZone ZoneI
  • 包含小时、分钟和秒的周期[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要一个代表年 月 周 日 小时 分钟 秒的间隔数据类型 前三年 年 月 日 可以用Period最后
  • RSA 加密-解密:BadPaddingException:数据必须以零开头

    对于一个被问了很多次的问题 我很抱歉向您询问您的技能 我有一个关于 RSA 加密的问题 我已经检查过有关此问题的其他主题 但没有找到任何有用的答案 我希望你能帮助我 我想读取一个文件 加密其内容 然后解密它并将这些解密的字节放入一个新文件中
  • 黄瓜与 Micronaut

    我正在尝试将 Cucumber 与 Micronaut 一起使用 但当我尝试将其与 Cucumber 一起使用时 MicronautTest 注释根本不起作用 未注入 theApple 请参阅下面的代码 如果我在没有黄瓜的情况下运行它就可以
  • 如何使用 Spring Security 跨多个基于 JVM 的应用程序实现单点登录

    我目前正在尝试跨多个基于 JVM Grails Servlet 的 Web 应用程序实现单点登录解决方案 这些应用程序目前都部署在同一个 servlet 容器 当前是 Tomcat 但不想将我的解决方案仅限于 Tomcat 中 所有 Web
  • 从继承的受保护 Java 字段创建公共访问器

    我怎样才能完成以下工作 class Foo extends javax swing undo UndoManager increase visibility works for method override def editToBeUnd
  • 为什么 MetaSpace 大小是已用 MetaSpace 的两倍?

    我写了一个程序来模拟MetaSpace OOM 但我发现MetaSpace Size几乎总是两倍大Used MetaSpace Why 我用标志运行我的程序 XX MaxMetaspaceSize 50m 程序抛出OOM时Used Meta
  • 文件保存在文件系统中 VS 保存在数据库中

    我正在设计一个 servlet 或 Struts2 中的操作 用于文件 图像 文档等 下载 但我想知道哪种更好的方法可以将文件保留在文件系统和数据库中 只需保留文件的路径或将文件保留在数据库中 如 BLOB 我知道当我查询数据库时 哪里的
  • (Java) 在 Mac OS X 上以编程方式访问“系统根目录”下的 SSL 证书

    我正在编写一个 Java 应用程序 它可以通过远程 Https 站点进行 REST Api 调用 远程站点由受信任的证书签名 它在 Windows 上运行良好 但由于 SSL 证书问题 在 OS X 上运行时遇到问题 我做了一些挖掘 发现原
  • 从 org.w3c.dom.Node 获取 Xpath

    我可以从 org w3c dom Node 获取完整的 xpath 吗 假设当前节点指向 xml 文档中间的某个位置 我想提取该元素的 xpath 我正在寻找的输出 xpath 是 parent child1 chiild2 child3
  • 将传入字符串的 unicode 表示形式转换为 UTF-8?

    我正在读取一些已经转换为 html 样式 代码的数据 我现在需要将其转换回 UTF 8 字符以供查看 不幸的是我无法使用浏览器查看该字符串 我读过有关 java 中的转换的内容 似乎如果你有一个 uxxxx 字符串 那么编译器会为你转换 然
  • 日志记录在 Android 设备上实际上有什么作用?

    我一直在 Android 示例中看到这样的代码 try catch Exception e Log e Error e getMessage 什么是Log e实际上在物理设备上做什么 它进入系统日志 开发人员可以通过 SDK 工具访问该日志
  • HashSet 与 LinkedHashSet

    它们之间有什么区别 我知道 LinkedHashSet 是 HashSet 的有序版本 维护一个跨所有元素的双向链接列表 使用此类代替 HashSet 当您关心迭代顺序时 当你迭代 HashSet 时 顺序是不可预测的 而 LinkedHa
  • WebSocketStompClient 将无法连接到 SockJS 端点

    我正在尝试新的 从版本 4 2 开始 java STOMP 客户端支持 我的出发点是入门指南 使用 WebSocket 构建交互式 Web 应用程序 http spring io guides gs messaging stomp webs
  • 为什么 HttpServletRequest 输入流为空?

    我有这段代码 我从请求输入流读取输入并使用 JacksonMapper 转换为 POJO 它在具有 guice 支持的 jetty 7 容器中运行 Override protected void doPost HttpServletRequ
  • 在 Java 服务器中验证 Windows 用户

    我正在开发一个用 Java 编写的服务器和一个在同一网络上的 Windows 计算机上运行的客户端 用 Net 编写的桌面应用程序 我希望进行一些基本身份验证 以便服务器可以确定运行客户端的用户的用户名 而不需要用户在客户端中重新输入其 W
  • RecyclerView 适配器的 Kotlin 泛型

    我正在尝试编写一个通用的 recyclerview 适配器 我找到了几个例子 然而 仍然无法弄清楚如何实现通用适配器 我写的代码是 open abstract class BaseAdapter

随机推荐

  • 会话没有被破坏

    我有这个文件 安全 php session start if empty SESSION u name header Location emprego php if isset GET logout session destroy head
  • 通用 Windows 平台是否会取代 Windows 8 和 Windows Phone 应用程序的 WinRT?

    通用 Windows 平台是否会取代 Windows 8 和 Windows Phone 应用程序的 WinRT 我的意思是 有一个 WinRT 平台专门为 Windows 8 开发 Metro 应用程序 现在 它被 UWP 取代了 不是吗
  • CPU利用率和能耗之间有什么关系?

    描述 CPU 利用率和能源消耗 电 热方面 之间关系的函数是什么 我想知道它是否是线性 次线性 exp 等 我正在编写一个程序 可以降低其他程序的 CPU 利用率 负载 我主要关心的是我能在能源方面受益多少 此外 我的服务器主要用作数据中心
  • HTTP 慢速发布和 IIS 设置以防止

    因此 我们从一家安全公司收到了这份报告 称我们在 IIS 8 0 上运行的 MVC 网站容易受到慢速 HTTP post DoS 攻击 报告指出我们应该 限制请求属性是通过
  • 如何等待猫鼬查询的结果?

    我尝试根据猫鼬查询的结果过滤数组 标准过滤器函数期望回调返回 true 或 false 我的麻烦是这个信息取决于 mongoose findOne 查询的异步结果 code that does not work myArray filter
  • PageSpeed 指责脚本在使用外部图像时存在“渲染阻塞”

    我在页面正文的结束标记之前放置了一个来自 CDN 的脚本 上面 谷歌的 PageSpeed Insights 说 消除首屏内容中阻碍渲染的 JavaScript 和 CSS您的页面有 1 个阻止脚本资源 这会导致页面渲染延迟 我在结束之前就
  • 使用 Visual Studio 2008 错误创建输出文件夹

    我有很多项目的解决方案 实际上有一个核心项目和一些插件 我更改了所有插件的 OutputPath 因此所有二进制文件最终都位于 Core bin debug 文件夹中 这是必要的 因为核心没有对插件的引用 因此它在编译时不会 包含 插件二进
  • Cocoa应用程序菜单-如何重新创建?

    在 MainMenu xib 中 我删除了默认的主菜单 它会自动为您提供应用程序菜单 以及文件 编辑 格式 查看 窗口 帮助菜单 我需要采取哪些步骤才能将其添加回我的应用程序中 我将创建一个新应用程序 然后仅复制Main Menu回到你的M
  • 如何限制Java 8应用程序消耗的总内存?

    为了限制 Java 7 应用程序消耗的总内存 我可以使用以下公式 取自本文 https plumbr eu blog why does my java process consume more memory than xmx 最大内存 Xm
  • VB6:如何从日期类型中删除时间部分

    我有一个Date还包含时间的变量 Dim dt As Date dt 8 3 2016 7 10 40 AM gt 以某种方式删除时间 所以结果应该是 dt 8 3 2016 怎么去掉时间呢 对于另一个日期类型变量 dt DateValue
  • Rails 3 ActiveRecord:UNION

    有没有办法在 Rails 3 中使用 MySQL UNION 我认为让其工作的唯一方法是直接执行查询 ActiveRecord Base connection execute SELECT REPEAT a 1 UNION SELECT R
  • 根据组枚举mysql中的行

    我有一组记录 例如 A B 1 5 1 6 1 9 2 1 2 8 其中我们有两个组 A 1 和 A 2 组内记录按 B 中的值排序 我需要在每个组中添加一个带有枚举的列 A B C 1 5 1 1 6 2 1 9 3 2 1 1 2 8
  • 将父类强制转换为子类

    我有 Message 类 我已经扩展并添加了新属性 class ChildMessage Message prop 在尝试将消息类添加到 ChildMessage 列表时 我得到添加类的 Null 引用 var myChildList ne
  • BMI计算器C代码[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在尝试编写一个简单的 BMI 计算器 但出于某种原因 当我尝试身高 175 公式为 1 75 和体重 70 时 它应该给出 2
  • 使用 OpenXmlReader

    我讨厌诉诸 StackOverflow 来获取如此 看似 基本的东西 但过去几个小时我一直在与 Microsoft 斗争 似乎陷入了死胡同 我正在尝试阅读 大型 Excel 2007 电子表格 Google 友好地告诉我 使用 OpenXm
  • UITableview:单击自定义按钮时动态更改单元格高度

    我有一个 UITableview 其中每个单元格都有一个按钮 我的问题是 如果我单击第一行中的按钮 单元格的高度会增加 然后我单击 tableviewcell 中的另一个按钮 已展开的单元格高度将减小 选定的单元格高度将增加 尝试此链接后U
  • Ruby on Rails:符号作为 form_for 中的参数

    我明白传递给的是什么form for执行以下操作时的方法 if user在控制器中设置 这是很明显的 但当我们经过时会发生什么 user 正如我在很多例子中看到的那样 我什么时候应该使用符号版本 使用该符号将生成
  • Objective C 类通过工厂方法继承

    我想继承一个具有工厂方法的框架类 如何使工厂方法返回我继承的类类型的对象 我发现这篇有用的文章 http qualitycoding org factory method 它描述了类似的情况 但在他们的情况下你可以控制超类 我怎么能写 比如
  • 我可以使用临时的右值引用吗?这是未定义的行为吗?

    更新问题为什么这两个右值引用示例有不同的行为 https stackoverflow com questions 35315472 why this two rvalue references examples have different
  • java.util.List 的降序迭代器

    链表可以使用升序或降序迭代器进行迭代 如下所示 LinkedList list new LinkedList StringJoiner sJ1 new StringJoiner list iterator forEachRemaining