go语言从例子开始之Example39.使用函数自定义排序

有时候我们想使用和集合的自然排序不同的方法对集合进行排序。例如,我们想按照字母的长度而不是首字母顺序对字符串排序。这里是一个 Go 自定义排序的例子。

Example:

package main
import (
    "fmt"
    "sort"
)

//为了在 Go 中使用自定义函数进行排序,
//我们需要一个对应的类型。
//这里我们创建一个为内置 []string 类型的别名的byLength 类型,
type byLength []string

//我们在类型中实现了 sort.Interface 的 Len,Less和 Swap 方法,
//这样我们就可以使用 sort 包的通用Sort 方法了,Len 和 Swap
//通常在各个类型中都差不多,Less 将控制实际的自定义排序逻辑。
//在我们的例子中,我们想按字符串长度增加的顺序来排序,所以这里使用了 len(s[i]) 和 len(s[j])。
func (s byLength) Len() int{
    return len(s)
}

func (s byLength) Swap(i, j int){
    s[i], s[j] = s[j], s[i]
}

func (s byLength) Less(i, j int) bool{
    return len(s[i]) < len(s[j])
}

func main() {
    //一切都准备好了,我们现在可以通过将原始的 sortstr 切片转型成 byLength 来实现我们的自定排序了。
    //然后对这个转型的切片使用 sort.Sort 方法。
    sortstr := []string{"abc", "abcd", "ab"}
    sort.Sort(byLength(sortstr))
    fmt.Println(sortstr)
}

Result:

$ go run example.go
[ab abc abcd]

坐标: 上一个例子   下一个例子

原文地址:https://www.cnblogs.com/yhleng/p/11775087.html

时间: 2024-07-29 19:15:02

go语言从例子开始之Example39.使用函数自定义排序的相关文章

C++语言笔记系列之十八——虚函数(1)

1.C++中的多态 (1)多态性:同一个函数的调用可以进行不同的操作,函数重载是实现多态的一种手段. (2)联编:在编译阶段进行联接,即是在编译阶段将一个函数的调用点和函数的定义点联接起来. A.静态联编:在编译阶段就完成的函数联编--函数重载. B.动态联编:在程序的运行阶段由系统自动选择具体的函数--虚函数. 注:C++的多态主要指的就是动态联编. 2.虚函数 (1)虚函数是在函数的定义时将其声明为虚函数即可. (2)说明:virtual 数据类型 函数名(参数表) {函数体} A.目的:当

苹果新的编程语言 Swift 语言进阶(六)--函数和闭包

一 .函数 1.1. 函数的定义和调用 函数的定义以func关键字作为前缀,接着是函数名字,接着跟着一个可以带有参数,也可以不带参数的圆括号,接着用-> 指示函数的返回类型.函数执行体用一对大括号{}包围.如下定义了一个函数名为sayHello的函数,该函数包含一个名字为personName,类型为String的输入参数. func sayHello(personName:String) -> String { let greeting ="Hello, " +person

PHP 语言结构(Language constructs)和函数的区别

相信大家经常看到对比一些PHP应用中,说用isset() 替换 strlen(),isset比strlen执行速度快等. 例子: if ( isset($username[5]) ) { // The username is at least six characters long. } 原因是isset是语言结构,而strlen是一个函数.那什么是语言结构呢?它和函数有什么不同吗? 1. 什么是语言结构和函数 语言结构:就是PHP语言的关键词,语言语法的一部分:它不可以被用户定义或者添加到语言

在C语言中以编程的方式获取函数名

调试常用的 __FILE__, __FUNCTION__, __LINE__ 调试常用的 __FILE__, __FUNCTION__, __LINE__ 没想到 VC6 不支持 __FUNCTION__ 所以我写了如下的奇怪代码 //用来记录当前行和当前函数//也可说是记录 堆栈void log_stack(const char *file, int line, const char * function); //当然还要对 __FUNCTION__ 宏作点修饰,因为这个宏只是在函数里面才起作

C语言基础知识----指针数组 &amp;&amp; 数组指针 &amp;&amp; 函数指针 &amp;&amp;指针函数

指针数组 && 数组指针 char (*ptr)[5]; //定义一个指向数组指针ptr,指向包含5个char类型的数组 char *a[5]; //定义一个指针数组a,包含5个char*类型指针 #include <stdio.h> int main(void) {     char *a[5]={"red","white","blue","dark","green"};   

初探swift语言的学习笔记(类对象,函数)

swift扩展了很多功能和属性,有些也比较奇P.只有慢慢学习,通过经验慢慢总结了. 下面将初步学习一下类的写法. 码工,最大爱好就是看码,而不是文字,太枯燥. // // computer.swift // swiftDemo // // Created by apple on 14-6-8. // Copyright (c) 2014年 fengsh. All rights reserved. /* 写本例子的目的在于快速学习swift类的写法,包括知识点: 1.属性设置 2.构造.释构 3.

C语言中的回调函数调用过程以及函数指针使用

回调函数比喻: 你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货. 在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件. 回调函数是一个程序员不能显式调用的函数:通过将回调函数的地址传给调用者从而实现调用. 回调函数使用是必要的,在我们想通过一个统一接口实现不同的内容,这时用

【C语言天天练(三)】函数

对于程序来讲,函数的地位是不言而喻的.下面先给出函数的定义,然后根据定义分析C语言中的函数. 函数定义: 类型 函数名(形式参数) 代码块 由定义可以看出函数主要包括四部分:函数类型.函数名.函数形参.函数代码块. 函数类型:指明了函数返回值的类型,是整数.浮点数.指针甚至是结构体等等.需要注意的两点:1.如果类型是void,则没有返回值.如果是void *型的返回值,那可以返回任意类型的指针,这是ANSI C标准定义的,void *可以是任意类型的指针.2.返回值的类型应该与函数定义的类型相同

C语言K&R习题系列——使用缓冲区函数接受长字符输入

原题: Write a program to print all input lines that are longer than 80 characters.  ,实现起来不算难,关键是用到了缓冲区,很不错的一种思想! /* Write a program to print all input lines  * that are longer than 80 characters  */    #include < stdio.h >    #define MINLENGTH 81    /