簡體   English   中英

在球拍列表中查找出現元素

[英]Finding the occurence element in the list in racket

假設(list "apple" "orange" "apple" "grape" "orange")並產生(list (list 2 "apple") (list 2 "orange") (list 1 "grape"))

最常見的水果將首先出現在生產的列表中。 如果是平局,請按字母升序對捆扎的結對和水果進行排序。

在本地使用抽象列表功能,例如地圖,過濾器,文件夾和快速排序。 沒有遞歸。

我不確定如何做到沒有遞歸。

我這樣寫:

(define (function list)
   (cond
      [(empty? list) empty]
      [else
        (local
           (define (helper1 a b)
             (cond
               [(equal? a b) a]
               [else b]))
           (define T (foldr helper1 (first list) (rest list)))
           (define (count a)
             (cond
               [(equal? a T) true]
               [else false]))
           (define new-list (quicksort (length (filter count list)) >))]

最有效的方法是使用(可變)哈希表:

(define (count-by-type lst)
  ; create hash
  (define h (make-hash))
  ; update hash, creating entries if needed, otherwise adding 1 to existing entry
  (map (lambda (e) (hash-update! h e add1 0)) lst) 
  ; create list of (count key) elements from hash and sort accordingly
  (sort (map (lambda (e) (list (cdr e) (car e))) (hash->list h))
        (lambda (x y) (or (> (car x) (car y)) 
                          (and (= (car x) (car y)) (string<? (cadr x) (cadr y)))))))

測試:

> (count-by-type (list "apple" "orange" "apple" "grape" "orange"))
'((2 "apple") (2 "orange") (1 "grape"))

我只是重新回答了上一個問題 這似乎是一個類似的任務,但沒有struct

使用散列,您只需要遍歷未排序的列表即可完成此操作,然后生成一個列表,然后使用特殊的< -函數對列表進行排序,該函數先按計數排序,然后進行排序。

這些提示是針對功能性解決方案的。 首先對參數(sort list-of-fruits string>?) 結果按降序排列,與結果相反。

鑒於該列表至少包含一個元素:

(let rec ((cur (car sorted-fruits)) (cnt 1) (lst (cdr sorted-fruits)) (acc '()))
  (cond ((equal? cur (car lst)) (rec cur (add1 cnt) (cdr lst) acc))
        (else (rec (car lst) 1 (cdr lst) (cons (list cnt cur) acc)))))

這將產生一個帶有計數的升序列表。

如果再次排序:

(sort list-of-counts-and-fruit (lambda (x y) (>= (car x) (car y)))

在球拍中sort是穩定的。 這意味着如果列表中有兩個計數相等的對象,它們將以其原始順序結束。 原始順序是升序動物順序,因此結果是按計數降序排列,然后按名稱升序排列。

我猜想,可以通過將它們鏈接在一起來完成您的過程,也許可以使用let存儲中間體來使表達式更短,更易讀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM