【问题标题】:Iterate NavigableSet without having entrySet() available在没有 entrySet() 可用的情况下迭代 NavigableSet
【发布时间】:2013-02-28 11:15:38
【问题描述】:

我有一个 TreeMap,我按键反向排序,并试图循环输出值,但 NavigableSet 没有 entrySet() 作为方法,这是我找到的所有示例。

我的java非常新手,所以我现在的知识有限,无法修改示例中看到的代码。

<%@page
import="java.util.Iterator,
        java.util.Map,
        java.util.TreeMap,
        java.util.NavigableSet,
        com.day.cq.wcm.api.PageFilter"
%>

    TreeMap<String, String> news = new TreeMap<String, String>();

    String listroot = properties.get("listRoot", currentPage.getPath());
    Page rootPage = pageManager.getPage(listroot);
    if (rootPage != null) {
        Iterator<Page> children = rootPage.listChildren(new PageFilter(request));
        while (children.hasNext()) {
            Page child = children.next();

            String title = child.getTitle(); //value
            String url = child.getPath(); //value
            String dcreated = child.getProperties().get("jcr:created",""); //key

            news.put( dcreated, title + "::" + url );
        }
        NavigableSet nset = news.descendingKeySet(); //Reverse order the entries
        for( String value : nset.values()  ) { //I know this is incorrect.
            out.println( value + "<br>");
        }
    }
%>

我确信有一种更有效的方法可以做到这一点,但现在这是我能想到的。

【问题讨论】:

    标签: java map iterator treemap aem


    【解决方案1】:
    news.descendingMap().entrySet();
    

    【讨论】:

    • 我做了for ( Map.Entry&lt;String, String&gt; entry : news.descendingMap().entrySet() ),用entry.getValue()输出,效果很好。我想这就是您的建议的实施方式?
    【解决方案2】:

    使用迭代器循环遍历集合。查看NavigableSetTreeSet api,我发现了一种提供降序迭代器的方法,因此不需要以相反的顺序创建新集合。

    编辑:以上错误假设news 的类型为TreeSet,而不是正确的TreeMap。代码已更改为正确的类型以成为正确的代码。

    Iterator newsItr = news.descendingKeySet().iterator();
    while(newsIter.hasNext()){
        out.println( news.get(newsItr.next()) + "<br>");
    }
    

    【讨论】:

    • descendingIterator() 是 NavigableSet 类型,那么在使用 Iterator 声明之前我是否要转换 TreeMap? newsItr 只是一个循环通过集合的值,还是它实际上包含所有值?
    • 这行得通,除非您清楚地编写了 newsItrnewsIter。我在我的代码中调整了它。
    • 我为你的新闻变量混合了 NavigableSet 和 TreeMap。我已经修复了我的代码示例。我的理解是 for each 构造抽象出迭代器的非常常见的用法,只循环一个集合。
    • 此示例与原始代码示例有何不同?
    • @jtahlborn 这个例子是 for each 结构的非抽象版本。它是迭代器最常见的用途,但并不是迭代器的唯一用途。循环期间更复杂的操作可以通过直接访问迭代器来实现,而这在 for each 循环中是无法完成的
    猜你喜欢
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    • 2018-03-21
    • 1970-01-01
    相关资源
    最近更新 更多