1. 程式人生 > >排序與list.sort()使用

排序與list.sort()使用

諸如List<T>等泛型集合類,直接提供了sort()方法用於將集合中的元素進行排序。


但是,其前提是集合中存放的是可直接排序的基本型別,如List<int>, List<double>,如果


我們定義了一個自定義型別 Class MyClass,並建立一個自定義型別的集合如List<MyClass>,


那麼無參的sort()方法就不可用了,因為不知道如何排序了。這時就需要藉助:


IComparer 和 IComparable


首先,我們來看一下c#泛型List提供的Sort方法:


泛型List類的Sort方法有四種形式,分別是
1,不帶有任何引數的Sort方法----Sort();
2,帶有比較器引數的Sort方法 ----Sort(IComparer<T>)
3,帶有比較代理方法引數的Sort方法----Sort(Comparison<(Of <(T>)>))
4,帶有比較器引數,可以指定排序範圍的Sort方法----Sort(Int32, Int32 IComparer(T))


【解析:】第一種方法


使用這種方法不是對List中的任何元素物件都可以進行排序,List中的元素物件必須繼承IComparable介面,並且要實現IComparable介面中的CompareTo()方法,在CompareTo()方法中要自己實現物件的比較規則。


例如,Int32和Double都是實現了IComparable介面並重載了CompareTo方法的結構。(注:int和double都是Int32和Double的別名(alias))


【解析:】第二種方法


2,帶有比較器引數的Sort方法 ----Sort(IComparer<T>),


1)建立一個額外的比較器類:其實就相當於將排序功能中的比較操作,留個使用者來完成。這個比較操作必須在實現了IComparer介面的自定義比較類中完成;如:


class myComparer:IComparer<MyClass>


2)制定比較規則實現比較方法:因為介面中有一個用於比較的過載函式Compare,所在在比較器類中我們必須實現它,完成自己希望的比較。所謂自己希望的比較就是說自己實現自定義物件的比較規則,例如你知道自定義類MyClass中哪個屬性適合用來排序,那麼就選擇這個屬性作為整個自定義類物件的排序屬性,如該類中有年齡,學號,入學日期等屬性,你可以選擇年齡屬性作為排序屬性。如:


public class myComparer:IComparer<MyClass> 
        {
            //實現按年齡升序排列
            public int Compare(MyClass x, MyClass y)
            {
                return (x.age.CompareTo(y.age)); //age代表年齡屬性是整型,即其已支援CompareTo方法
            }
        }


3)使用比較器的排序方法呼叫:然後,在自定義型別的集合如List<MyClass> myList,上就可以進行sort排序了,如


myList.Sort(new myComparer());


【解析:】第三種方法


3,帶有比較代理方法引數的Sort方法----Sort(Comparison<(Of <(T>)>))


Comparison<(Of <(T>)>是一種泛型委託。所以,需要編寫一個物件排序比較的方法,對List中的元素物件沒有特殊的要求,但在比較方法中需要實現物件比較規則,這個方法實現後,就可以把這方名字作為引數委託給List的Sort方法,Sort方法在排序時會執行這個方法對List中的物件進行比較需要編寫一個物件排序比較的方法,對List中的元素物件沒有特殊的要求,但在比較方法中需要實現物件比較規則,這個方法實現後,就可以把這方名字作為引數委託給List的Sort方法,Sort方法在排序時會執行這個方法對List中的物件進行比較


【解析:】第四種方法


4,帶有比較器引數,可以指定排序範圍的Sort方法----Sort(Int32, Int32 IComparer(T))


對於第四排序方法,實際是第二種比較器排序的一個擴充套件,在指定排序比較器的同時,指定排序範圍,即List中準備排序的開始元素索引和結束元素索

//_______________________________________________________以上是List.sort使用

發生問題在,在客戶端和伺服器執行了相同的程式碼功能,執行list.sort(),排序的結果卻不同。

表現:發現原因在加速結束一個時間進度條的時候,結果的進度條是不是最短的那條。在點選升級新的技能的過程

Debug:在每一步點選,檢視客戶端執行後的排序結果和服務端執行後的排序結果。有一定可能性排序結果不同。

解決方法:因為排序原因的目的是找出時間最短的那條資料,參與排序的資料數量最多有5條;只要最簡單的比較交換就行。for方法

總結:確認需求的目標是找出時間最短的那條資料,排序只是方法。排序方法的選擇有多個選擇,根據需求選擇效果最高的。

相關推薦

排序list.sort()使用

諸如List<T>等泛型集合類,直接提供了sort()方法用於將集合中的元素進行排序。 但是,其前提是集合中存放的是可直接排序的基本型別,如List<int>, List<double>,如果 我們定義了一個自定義型別 Class My

C#基礎教程之IComparable用法,實現List.sort()排序

排序 跑步 地址 parent reading result object http 第k大的數 List<T>.sort()可以實現對T的排序,比如List<int>.sort()執行後集合會按照int從小到大排序。如果T是一個自定義的Objec

set、vectorlist的構造排序的耗時測試

隨機數 rand mem while += 賦值 ring alt 個數 測試目標測試在成員個數不斷遞增的情況下,set、vector與list的構造與排序的耗時變化,找出set耗時連續超過其他容器耗時的成員個數測試方式set使用直接插入vector使用assign構造並使

sorted sort的區別 正向排序 reverse()列表反向排序 列表數字倒序排序

ever pre 倒序 rev 所有 sorted 序列 字典 有效 >>> a = [1,3,6,7,4] >>> >>> sorted(a) [1, 3, 4, 6, 7] >>> >&g

Python3基礎 list sort 從小(大)到大(小)排序

markdown http block dem Language 初學者 pytho www. code ? python : 3.7.0 OS : Ubuntu 18.04.1

Python3 list sort排序

detail 格式 stc 進行 指定 python log list lambda 轉自:https://blog.csdn.net/u010758410/article/details/79737498      當帶排序列表的

[Swift]LeetCode148. 排序連結串列 | Sort List

Sort a linked list in O(n log n) time using constant space complexity. Example 1: Input: 4->2->1->3 Output: 1->2->3->4

[Swift]LeetCode148. 排序鏈表 | Sort List

tput etc break out ons class urn 空間復雜度 dea Sort a linked list in O(n log n) time using constant space complexity. Example 1: Input: 4-&

十個整數去重+排序——ArrayList的轉換/特別是資料型別

import java.util.ArrayList; //儘量記住util.*包!!! import java.util.Arrays; import java.util.List; import java.util.Scanner; public class QUchong {

Java 氣泡排序 Arrays.sort(arr) 比較

前段時間收到一個獵頭電話面試,問了關於氣泡排序的.我居然一時間想不起來... 只是回答了,大概倆個for迴圈什麼的... 今天想起來,複習下:        jdk 1.8.0_181 package review; import

在java中對LIst集合的兩種排序方法(即sort的使用方法)

List集合的排序: java提供了兩種排序方式,分別是Collections.sort(List)和Collections.sort(List,Commparator),下面就這兩種方法的使用做詳細的說明: -Collections.sort(List); sort的引數是一

(PAT)Insertion or Heap Sort(堆排序插入排序)

Insertion sort iterates, consuming one input element each repetition, and growing a sorted output list. Each iteration, insertion sort r

【LeetCode】#148排序連結串列(Sort List)

【LeetCode】#148排序連結串列(Sort List) 題目描述 在 O(n log n) 時間複雜度和常數級空間複雜度下,對連結串列進行排序。 示例 示例 1: 輸入: 4->2->1->3 輸出: 1->2->3->4

STL 原始碼分析《1》---- list 歸併排序的 迭代版本, 神奇的 STL list sort

最近在看 侯捷的 STL原始碼分析,發現了以下的這個list 排序演算法,乍眼看去,實在難以看出它是歸併排序。 平常大家寫歸併排序,通常寫的是 遞迴版本。。為了效率的考慮,STL庫 給出瞭如下的 歸

關於Sort排序冒泡法的區別

Sort排序和冒泡法的異同 對陣列a{2,4,3,6,2,8,1}進行排序。 快速排序法 原理: 對於陣列a{2,4,3,6,2,8,1} ①  需要選取一個關鍵元素作為基準元素key,用陣列內所有元素跟基準元素比較大小 ②  先假設陣列內第一個元素的角標為i,最後一個元

C#List Sort多欄位排序

多欄位排序的問題其實很簡單,只要實現一個自己的Comparator就可以。  例如我有一個類class Student {  public String name;  public int id;  public char gender;  public Student(S

計數排序(Counting Sort基數排序(Radix Sort)小結

比較排序的效能極限:        對於氣泡排序、插入排序、歸併排序、堆排序、快速排序等通過將待排序元素進行比較來實現排序的演算法,它們有一個時間複雜度的極限,即:最壞情況下有漸進下界:。 -----

C語言 資料結構排序查詢 資料結構實驗之排序三:bucket sort

資料結構實驗之排序三:bucket sort Time Limit: 250MS Memory Limit: 65536KB Submit Statistic Problem Description 根據人口普查結果,知道目前淄博市大約500萬人口,你的

python中sort排序sorted排序

sort排序 sort排序結果會影響本身結構 例: a = [2,13,7,34] a.sort() print(a) # [2, 7, 13, 34] b = a.sort() # 錯誤寫法 如果需要一個排序好的列表,同時保持原列表不變,怎麼實現呢? a = [2,1

Python的排序:關於sort()sorted()

list.sort() list的一個方法,具有三個引數:cmp,key,reverse(Python3只有後兩個) 一個list呼叫sort方法後,對該list進行排序,不儲存原list 引數解釋: cmp(僅支援Python2) : 比較函式,可以