Golang 实现 set 集合,变相实现 切片去重、排序 功能

Java中的集合(set)去重很方便,PHP中的数组值去重,就更加方便,一个函数搞定:array_unique(),Golang中就比较苦逼了,官方没有提供对“切片去重”的功能,而项目中,又经常用到这个功能,,我们可以模拟Java集合的功能,实现Golang版集合的同时,顺便把去重和排序做了,它的主要实现原理是:利用map数据不允许键重名的特点,参考代码如下:#set_int.gopackageutilsimport("sort""sync")//实现set集合,变相实现切片去重//byphpgo.cnblogs.comtypeIntSetstruct{mmap[int]boolsync.RWMutex}funcNewIntSet()*IntSet{return&IntSet{m:map[int]bool{},}}func(s*IntSet)Add(items...int){s.Lock()defers.Unlock()iflen(items)==0{return}for_,item:=rangeitems{s.m[item]=true}}func(s*IntSet)Remov...

PHP二维数组排序(list_order)

/***对二维数组进行排序*模拟数据表记录按字段排序**<code>*@list_order($list,$get['orderKey'],$get['orderType']);*</code>*@paramarray$array要排序的数组*@paramstring$orderKey排序关键字/字段*@paramstring$orderType排序方式,'asc':升序,'desc':降序*@paramstring$orderValueType排序字段值类型,'number':数字,'string':字符串*@linkhttp://www.cnblogs.com/52php/p/5668809.html*/functionlist_order(&$array,$orderKey,$orderType='asc',$orderValueType='string'){if(is_array($array)){$orderArr=array();foreach($arrayas$val){$orderArr[]=$val[$orderKey];}$order...

排序算法的复习和总结[PHP实现]

对于PHP中对数组的元素进行排序,这个是很经常用到的,之前的项目中也有,而且对于几种排序我们都是用的是asort arsort等PHP原生函数,没有自己去实现,所以就对一下的几个函数进行总结,这个会不断的进行补充,自己也可以好好的复习和总结。直接上代码吧!<?php/***插入排序(一维数组)*每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当的位置,使数列依然有序;直到待排序的数据元素全部插入完成为止。*/functioninsertSort($arr){if(!is_array($arr)||count($arr)==0){return$arr;}$count=count($arr);for($i=1;$i<$count;$i++){if(isset($arr[$i])){$tmp=$arr[$i];//获取后一个元素的值$j=$i-1;//获取前面的下标while($arr[$j]>$tmp){//如果前面一个比后面一个大,这里是从小到大$arr[$j+1]=$arr[$j];//把小的元素和前面的对换,直到移动到合适的位置,在移动下一个$...

数据量很大的排序问题 大量数据如何排序

  问题一:若有1T的数据,比如只有两列,身份证号和姓名需要实现由大到小排序,你用什么办法,能否做到复杂度为O(n),说说你的思路和想法?  问题二:有10个G的数据,也是一样,比如两列,身份证号和姓名,如果两条数据一样,则表示该两条数据重复了,现在给你512的内存,把这10G中重复次数最高的10条数据取出来。 我的思路是:这么大的数据,用普通的排序一定不行,可以这样,用身份证号的前三位切割这个数据,这样会分成999份,每一份再进行排序,比如构造一个平衡二叉树,最典型的的就是TreeMap和TreeSet(TreeSet底层是使用了TreeMap算法,而TreeMap算法底层是实现了红黑树的平衡二叉树的排序);然后按照文件名进行排序,这样就实现了大数据排序;因为排序二叉树的复杂度为O(lgn)到O(n);因此我们可以做到O(n) 问题二: 解法是一样的按照身份证号前三位分割999份,然后对这每个文件找到重复的最多的十条,这样,我们得到了999个文件,每个文件有10条数据 在对这个999*10条进行排序找到重...

PHP 多维数组 根据字段排序

这个太常用了,记录下、方便后面用/***@param$arr[要排序的数组]*@param$condition[要排序的条件,forarray('id'=>SORT_DESC,'add_time'=>SORT_ASC)]*@returnbool|mixed*对二维数组多个字段排序*/functionSortArrByManyField($arr,$condition){if(empty($condition)){returnfalse;}$temp=array();$i=0;foreach($conditionas$key=>$ar){foreach($arras$k=>$a){$temp[$i][]=$a[$key];}$i+=2;$temp[]=$arr;}$temp=&$arr;call_user_func_array('array_multisort',$temp);returnarray_pop($temp);}...

Linux 底下使用C语言的 单链表 ,双链表,二叉树 读取文件,并排序

直接上代码单链表Linux读文件排序:双链表Linux读取文件排序: 二叉树LinuX读取文件并排序:...

二叉树 排序二叉树-可以通过中序遍历得到排序的数据 二叉排序树时间复杂度O(logn),

二叉树是一种非常重要的数据结构,它同时具有数组和链表各自的特点:它可以像数组一样快速查找,也可以像链表一样快速添加。但是他也有自己的缺点:删除操作复杂。虽然二叉排序树的最坏效率是O(n),但它支持动态查找,且有很多改进版的二叉排序树可以使树高为O(logn),如AVL、红黑树等。对于排序二叉树,若按中序遍历就可以得到由小到大的有序序列。我们先介绍一些关于二叉树的概念名词。二叉树:是每个结点最多有两个子树的有序树,在使用二叉树的时候,数据并不是随便插入到节点中的,一个节点的左子节点的关键值必须小于此节点,右子节点的关键值必须大于或者是等于此节点,所以又称二叉查找树、二叉排序树、二叉搜索树。完全二叉树:若设二叉树的高度为h,除第h层外,其它各层(1~h-1)的结点数都达到最大个数,第h层有叶子结点,并且叶子结点都是从左到右依次排布,这就是完全二叉树。满二叉树——除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层的二叉树。深度——二叉树的层数,就是深度。二叉树的特点总结:(1)树执行查找、删除、插入的时间复杂度都是O(logN)(2)遍历二叉树的方法包括前序、中序、后序(3)非平衡...

双链表排序

http://blog.chinaunix.net/uid-22556372-id-1773401.html...
代码星球 代码星球·2021-01-15

Linux C 单链表 读取文件 并排序 实例并解释

 C的指针挺头疼的,先看一个例子:给指针赋值和通过指针进行赋值这两种操作的差别确实让人费解。谨记区分的重要方法是:如果对左操作数进行解引用,则修改的是指针所指对象的值;  如果没有使用解引用操作,则修改的是指针本身的值。帮助理解下列例子: strings1("somevalue");            string*sp1=&s1;                        // sp1 ------>s1:somevalue  strings2("another"); string*sp2=&s2; &...

双向链表排序

   双向链表排序  2006-10-11*/#include<stdio.h>#include<stdlib.h>#include<string.h>#include<assert.h>typedefstructNode{ intdata; structNode*left; structNode*right;}Node;//创建一个双向链表,输入整数,以-1作为结束Node*CreateDLinkList(){ intdata; Node*pNewNode; Node*pHead=NULL; Node*pLast=NULL; while(1) {  scanf("%d",&data);  if(-1==data)   break;  pNewNode=(Node*)malloc(sizeof(Node)...
代码星球 代码星球·2021-01-15

TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?

TreeSet要求存放的对象所属的类必须实现Comparable接口,该接口提供了比较元素的compareTo()方法,当插入元素时会回调该方法比较元素的大小。TreeMap要求存放的键值对映射的键必须实现Comparable接口从而根据键对元素进行排序。Collections工具类的sort方法有两种重载的形式,第一种要求传入的待排序容器中存放的对象比较实现Comparable接口以实现元素的比较;第二种不强制性的要求容器中的元素必须可比较,但是要求传入第二个参数,参数是Comparator接口的子类型(需要重写compare方法实现元素的比较),相当于一个临时定义的排序规则,其实就是通过接口注入比较元素大小的算法,也是对回调模式的应用(Java中对函数式编程的支持)。例子1:publicclassStudentimplementsComparable<Student>{privateStringname;//姓名privateintage;//年龄publicStudent(Stringname,intage){this.name=name;this.age=age;}...

js-冒泡

<divcolor:rgba(128,0,0,1)">"border:3pxsolidblack;height:100px"onclick="alert('我是div')"><pcolor:rgba(128,0,0,1)">"border:2pxsolidred;height:50px"onclick="alert('我是p便签')"><inputvalue="点我"type="button"onclick="alert('我是input')"></p></div> ...
代码星球 代码星球·2021-01-09

复杂排序实现

注:本篇写一些常见的复杂排序的实现,比如:快速排序,堆排序,归并排序1,快速排序:#include<iostream>#include<ctime>#include<cstdlib>usingnamespacestd;voidprintIn(int*a,intlength){for(inti=0;i<length;i++)cout<<a[i]<<'';}voidswap(int&a,int&b){//行参为引用,可直接修改实参的值inttemp;temp=a;a=b;b=temp;}intInRandomRange(inta,intb){//形参不是引用,不修改实参的值intrandomNumber=rand()%(b-a+1)+a;//生成[a,b]中的随机数returnrandomNumber;}//教材思想intPartition1(int*arr,intleft,intright){intpivot=arr[left];//选取第一个元素为基准while(left<right){while(...
代码星球 代码星球·2021-01-09

简单排序实现

注:本篇文章简单实现了几种常见的排序,包括:冒泡排序,简单选择排序,插入排序,折半插入排序。#include<iostream>usingnamespacestd;voidswap(int&a,int&b){inttemp;temp=a;a=b;b=temp;}voidbubbleSort(int*arr,intlength){//冒泡排序boolflag=false;for(inti=length-1;i>0;i--){for(intj=0;j<i;j++){if(arr[j]>arr[j+1]){swap(arr[j],arr[j+1]);flag=true;cout<<"testing"<<endl;//测试交换次数}}if(flag==false)break;}}voidselectSort(int*arr,intlength){//简单选择排序for(inti=0;i<length;i++){intminValue=arr[i];intminValueIndex=i;for(intj=i;j<l...
代码星球 代码星球·2021-01-09

mysql排序让空值NULL排在数字后边

从现实项目需求出发;有一张城市表;里面有北京、上海、广州、河北、天津、河南6座城市;mysql> select * from bjy_order;+----+------+| id | city |+----+------+|  1 | 北京 ||  2 | 上海 ||  3 | 广州 ||  4 | 河北 ||  5 | 天津 ||  6 | 河南 |+----+------+要求是让上海排第一个、天津排第二个;最简单粗暴的方法就是添加一个order_number字段;用来标识顺序的;然后通过orderbyorder_numberasc排序mysql> select * ...
首页上一页...1516171819...下一页尾页