0

我有任何速度数组也有重复值。我想创建一个具有唯一值的数组,其中所有值都根据它们在原始数组中的计数/频率进行排序。

例如:

                #set($y = 0)
                #set ($pagelist = [])
                #foreach($label in $page.labels) 
                    #set($pinnedPages = $repository.getContentByLabel("$!label"))
                    #set($currentpage = $page)
                 
                    ## Display the page that has a label that matches current page label.            
                    #foreach($page in $pinnedPages)
                        #if($page != $currentpage)
                            ## Display the page name as a list item. 
                            #set ($pagelistswallow = $pagelist.add($page.title))
                            <li>$pagelist.get($y)</li>
                            #set($y = $y + 1)
                        #end
                    #end            
                #end

pagelist数组具有页面名称,其中很少出现在该数组中多次出现。我需要一个具有唯一页面名称的数组,该数组按照它们在原始页面列表数组中的频率顺序进行排序。

任何人都可以帮忙吗?我试过了,但我的代码不起作用......

4

1 回答 1

1

你可以做 :

#foreach($label in $page.labels) 
  #set($pinnedPages = $repository.getContentByLabel("$!label"))
  #set($currentpage = $page)
  
  ## Prepare a map (title -> occurrences) of pages
  ## which have a label that matches current page label.
  
  #set($pagemap = {})
  #foreach($subpage in $pinnedPages)
    #if($subpage != $page)
      #set($junk = $pagemap.put(
        $page.title,
        $pagemap.getOrDefault($page.title, 0) + 1))
    #end
  #end

  ## Calculate a map (occ, title) -> title

  #set($pagetmp = {})
  #foreach($entry in $pagemap.entrySet())
    #set($junk = $pagetmp.put(
      "${entry.value}_${entry.key}",
      $entry.key))
  #end

  ## Display those related pages by increasing
  ## number of occurrences (just reverse the array
  ## for a decreasing order)

  #set($pagekeys = $pagetmp.keySet().stream().sorted().toArray())
  #foreach($key in $pagekeys)
    <li>(label: $label) $pagetmp.get($key)</li>
  #end

#end

显式使用的需要sorted()来自 Velocity 空映射是LinkedHashMap,因此键顺序是哈希,而不是自然顺序。

作为一种变体,为了能够显示出现次数,您可以轻松地修改此代码以将$pagetmp值设为 map { occ, title }

编辑

如果您使用的是 Velocity 1.6,则必须将指令拆分#set($junk = ...)为:

#set($subinit = $pagemap.getOrDefault($pagetitle, 0) + 1)
#set($junk = $pagemap.put($page.title, $ubinit))
于 2020-06-27T12:07:45.917 回答