我在 Kotlin 中定義了一個公共類:public class Edge(val v: Int, val u: Int, val weight: Double)它幫助我定義圖形的加權邊。
現在,在另一個班級中,我需要創建一個串列,我將其定義為var Sides = mutableListOf<Edge>()但我需要按升序對串列進行排序,這取決于 Edge 的第三個引數(即 weight)。所以如果我有清單:
Sides = {Edge(4, 8, 4.1), Edge(20, 9, 7.5), Edge(5, 4, 0.0)},變成:
邊 = {邊(5, 4, 0.0),邊(4, 8, 4.1),邊(20, 9, 7.5)}
有沒有像 .sort()我可以用來訂購這個串列的功能?還是我必須為此手動創建排序方法的功能?
提前致謝
uj5u.com熱心網友回復:
對于像 的可變集合MutableList,您可以使用該sortBy函式對原始串列本身進行排序。
sides.sortBy { it.weight }
而且,如果您有一個不可變的集合,例如List,您可以使用sortedBy回傳新排序串列的函式。
val sortedList = sides.sortedBy { it.weight }
此外,您有sortByDescending和sortedByDescending用于按降序排序。
uj5u.com熱心網友回復:
您正在尋找sortBy. 給定一個 , 的串列T,sortBy從Tto獲取一個映射函式R(其中R是某種定義了排序的型別)。考慮
Sides.sortBy { n -> n.weight }
uj5u.com熱心網友回復:
您有兩種基本方法:
- 給出
Edge一個自然排序。然后所有的排序函式都將默認使用它 - 其他任何可以使用排序的東西(例如 a 中的鍵的順序SortedMap和binarySearch()方法)。
您可以通過實作Comparable介面來做到這一點。這有一個方法,compareTo(),它可以很簡單:
public class Edge(val v: Int, val u: Int, val weight: Double) : Comparable<Edge> {
override fun compareTo(other: Edge) = weight.compareTo(other.weight)
}
但是,這并沒有為具有相同權重的實體提供一致的排序,因此您可能還想使用其他屬性作為決勝局,例如:
override fun compareTo(other: Edge)
= weight.compareTo(other.weight).takeIf{ it != 0 }
?: v.compareTo(other.v).takeIf{ it != 0 }
?: u.compareTo(other.u)
(在實作它時有一些微妙之處,特別是如果您還沒有覆寫equals()直接對應。Java 檔案值得一讀。)
請注意, a 會按照該順序使用其建構式中的屬性data class自動實作Comparable。所以你通常不需要擔心訂購。
- 排序時提供排序。
其他答案對此進行了討論。也許最簡單的方法是:
sides.sortBy{ it.weight }
雖然有很多選擇,例如:
sides.sortWith{ a, b -> a.weight.compareTo(b.weight) }
或者您可以創建一個Comparator可以根據需要重用的實體:
val comparator = Comparator<Edge>{ o1, o2 -> o1.weight.compareTo(o2.weight) }
sides.sortWith(comparator)
同樣,比較器可以與標準庫中的許多函式一起使用,因此您可以避免重復權重比較代碼。
選擇哪種方法取決于您的需求。
如果您的邊緣總是按重量排列具有直觀意義,那么自然排序將是一個很好的選擇。這對代碼來說很簡潔:你只需要Comparable在一個地方實作(或者讓你的類 adata class使用首先指定的 weight 屬性),然后你就可以得到到處排序的全部好處。(當然,只有在您可以控制 Edge 源代碼的情況下才能這樣做。)
另一方面,如果基于權重的排序是特定于特定方法的——如果你可能想要在其他地方使用不同的排序——那么在排序時指定排序會更有意義。
當然,如果需要,您可以同時執行這兩種操作:您可以為物件提供適用于大多數事物的自然順序,然后為特定操作指定不同的順序。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/362894.html
上一篇:SwiftUI-Picker.onChange和didSet
下一篇:桶排序還是歸并排序?
