list排序

python中涉及到的对象排序

最后都变了- 提交于 2019-11-28 15:42:21
一、列表(list)排序:   1 sort()函数     list对象有sort()内置排序方法。     list.sort(key=None, reverse=False)     key:用来指定list中元素以什么形式去参与排序,该参数可以接受一个函数,以函数的返回值进行排序。     reverse:默认false(升序),true为降序。     sort()方法改变的是对象自身,所以元组在排序时要先转换为列表。   2内置函数sorted():     result = sorted(iterable,key=None,reverse=False)     iterable:为可迭代对象,     key:用来指定可迭代对象中各元素以什么形式参与排序,key可以为一个函数,将会以函数的返回值对元素进行排序,     reverse:默认false(升序),true为降序,     result:sorted()函数不改变对象本身,它返回的是iterable按照key的排序方式排好之后的对象。 二、字典(dict)排序:   1内置函数sorted():     字典没有实例排序方法sort()。     字典排序分为按key排序、按value排序。     按key排序: key_list = sorted(dict) 默认为按key排序

字典去重与排序

落花浮王杯 提交于 2019-11-28 15:33:56
l=[ {'name':'egon','age':18,'sex':'male'}, {'name':'alex','age':73,'sex':'male'}, {'name':'egon','age':20,'sex':'female'}, {'name':'egon','age':18,'sex':'male'}, {'name':'egon','age':18,'sex':'male'}, ] #1 s=set() l1=[] for item in l: val=(item['name'],item['age'],item['sex']) if val not in s: s.add(val) print(s) l1.append(item) print(l1) #2 def func(items,key=None): s=set() for item in items: val=item if key is None else key(item) if val not in s: s.add(val) yield item print(list(func(l,key=lambda dic:(dic['name'],dic['age'],dic['sex'])))) #3 l1=[] for i in l: if i not in l1: l1.append(i)

数组排序带索引

泄露秘密 提交于 2019-11-28 15:31:09
想到了两种方法来实现,分别利用了List.Sort()和Dictionary.OrderBy()方法,代码如下: 1   int[] arrInt = new int[] { 11, 38, 12, 9, 234, 24, 441, 24, 45, 35 }; 2 3 //List.Sort() 4 List<int> lstOrg = new List<int>(), lstSort = new List<int>(); 5 lstOrg.AddRange(arrInt); 6 lstSort.AddRange(arrInt); 7 lstSort.Sort(); 8 9 List<int> lstIndex = new List<int>(); 10 for (int i = 0; i < lstSort.Count; i++) 11 { 12 int index = lstOrg.IndexOf(lstSort[i]); 13 while (lstIndex.IndexOf(index) >= 0) 14 { 15 index = lstOrg.IndexOf(lstSort[i], index + 1); 16 } 17 lstIndex.Add(index); 18 Console.Write("({0},{1})", index, lstSort[i]); 19 }

python 排序 拓扑排序

瘦欲@ 提交于 2019-11-28 15:24:38
在计算机科学领域中,有向图的拓扑排序是其顶点的先行排序,对于每个从顶点u到顶点v的有向边uv,在排序的结果中u都在v之前。 如果图是有向无环图,则拓扑排序是可能的(为什么不说一定呢?) 任何DAG具有至少一个拓扑排序,并且这些已知算法用于在线性时间内构建任何DAG的拓扑排序 图论:是组合数学的一个分支,它和其他分支比如:群论、拓扑学、矩阵论有着密切的关系。图是图论的主要研究对象。图是由若干给定的顶点以及连接两定点的变构成的图形,这些图形通常用来描述某些事物间的某种特定关系。顶点用于代表事物,而顶点之间的边则代表事物之间具有这种特定关系。 在图论中,由一个有向无环图的顶点组成的序列,并且仅当满足以下条件时,称为改图的一个拓扑排序:   每个顶点只出现一次   当在序列中A出现在B以前,则图中不存在由B指向A的路径 算法思想 卡恩算法   找到入度为0的点,将该点放到结果中,然后再图中将此节点相连的边删去,重新搜索图,再次找到入度为0的点,因为这个点的父节点已经出现在结果集中,所以该点也能被放入结果集中。重复直到图中没有入度为0的点   如果此时结果集中的点个数等于原来图中的点的个数,就说明排序成功完成,否则就说明待排序的图不是有向无环图,无法排序 算法步骤   对于已经是有向无环图的排序过程:   找到入度为0的点,放入结果集中,然后删去与该节点相连的边   重复执行上述操作

深入Java源码剖析之Set集合

冷暖自知 提交于 2019-11-28 15:03:17
Java的集合类由Collection接口和Map接口派生,其中: List代表有序集合,元素有序且可重复 Set代表无序集合,元素无序且不可重复 Map集合存储键值对 那么本篇文章将从源码角度讨论一下无序集合Set。 HashSet HashSet实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。看下面的一个例子: HashSet<String> hs = new HashSet<String>(); // 添加元素 hs.add("hello"); hs.add("world"); hs.add("java"); hs.add("world"); hs.add(null); //遍历 for (String str : hs) { System.out.println(str); } 执行结果: null world java hello 由执行结果可知,它允许加入null,元素不可重复,且元素无序。 那我们想,它是如何保证元素不重复的呢?这就要来分析一下它的源码。 首先是HashSet集合的add()方法: public boolean add(E e) { return map.put(e, PRESENT)==null; } 该方法中调用了map对象的put(

Java.数据结构.集合体系详解

一个人想着一个人 提交于 2019-11-28 14:47:01
I. 第一部分:常见数据结构 首先简单说下数据结构. 什么是数据结构?数据结构就是组织数据的方式. 常见的数据结构:栈,堆,树,图,数组,队列,链表. 这里主要介绍与java集合体系相关的栈、数组和链表. 栈 特点:压栈弹栈,先进后出. 如:手枪弹夹装弹过程,最先压入的子弹在最下面;而在射击时,最先弹入枪膛的是最上面的子弹,即最后压入弹夹的子弹. 队列 特点:先进先出. 如:子弹射出的过程,先进入枪膛的子弹最先被射出. 数组 概述:用来存储同一种类型元素的容器。 特点:在内存中是连续的,每个元素都有编号(从0开始的),方便获取。但增删就比较麻烦,需要将目标位置后的所有数据前移动或后移. 查询快,增删慢. 链表 概述:把一些结点通过链子连接起来的数据结构。每个结点由地址域和数值域组成. 特点:增删快,查询慢. 增删时,只需要把所插入处的前后节点链条断开,增加或移除目标节点,速度很快。反之,查询时则需要遍历所有节点,直到找到目标节点,速度自然要慢。 II. 第二部分:Java中的Collection(集合)体系 2.1 集合体系概览: 集合体系分为4大块: Collection接口: Collection是最基本集合接口,它定义了一组允许重复的对象. 它有两个子接口:List和Set. 1. List下3个实现类:ArrayList, LinkedList, Vector.

《听说史上最全挺好用的》-java集合面试知识大全

余生长醉 提交于 2019-11-28 14:08:59
欢迎关注这一文章系列,一起学习 提升能力,涨薪可待 面试知识,工作可待 实战演练,拒绝996 也欢迎关注公 众 号【 Ccww笔记 】,原创技术文章第一时间推出 如果此文对你有帮助、喜欢的话,那就点个赞呗,点个关注呗! 一、集合基础 1.1 集合框架有哪些优点如下: 使用核心集合类降低开发成本,而非实现我们自己的集合类。 随着使用经过严格测试的集合框架类,代码质量会得到提高。 通过使用 JDK 附带的集合类,可以降低代码维护成本。 复用性和可操作性。 1.2 Java集合类框架的基本接口有哪些? Java 集合类提供了一套设计良好的支持对一组对象进行操作的接口和类。Java集合类里面最基本的接口有: Collection:代表一组对象,每一个对象都是它的子元素。 Set:不包含重复元素的 Collection。 List:有顺序的 collection,并且可以包含重复元素。 Map:可以把键(key)映射到值(value)的对象,键不能重复。 还有其它接口 Queue、Dequeue、SortedSet、SortedMap 和 ListIterator。 1.3 为什么集合类没有实现 Cloneable 和 Serializable 接口? 集合类接口指定了一组叫做元素的对象。集合类接口的每一种具体的实现类都可以选择以它自己的方式对元素进行保存和排序,可以使得集合类很灵活

Java集合详解

会有一股神秘感。 提交于 2019-11-28 13:50:37
一、数组和集合的比较 数组不是面向对象的,存在明显的缺陷,集合弥补了数组的缺点,比数组更灵活更实用,而且不同的集合框架类可适用不同场合。如下: 1:数组能存放基本数据类型和对象,而集合类存放的都是对象的引用,而非对象本身! 2:数组容易固定无法动态改变,集合类容量动态改变。 3:数组无法判断其中实际存有多少元素,length只告诉了数组的容量,而集合的size()可以确切知道元素的个数 4:集合有多种实现方式和不同适用场合,不像数组仅采用顺序表方式 5:集合以类的形式存在,具有封装、继承、多态等类的特性,通过简单的方法和属性即可实现各种复杂操作,大大提高了软件的开发效率 二、Java集合 此图可用Windows系统自带画图工具查看比较清晰 Collection和Map,是集合框架的根接口。 Collection的子接口: Set:接口 ---实现类: HashSet、LinkedHashSet Set的子接口SortedSet接口---实现类:TreeSet List:接口---实现类: LinkedList,Vector,ArrayList List集合 有序列表,允许存放重复的元素; 实现类: ArrayList:数组实现,查询快,增删慢,轻量级;(线程不安全) LinkedList:双向链表实现,增删快,查询慢 (线程不安全) Vector:数组实现,重量级 (线程安全

复习下comparable和comparator

与世无争的帅哥 提交于 2019-11-28 13:49:20
package com.sinosig.epassport.application; import java.util.Collections; import java.util.Comparator; import java.util.*; import java.lang.Comparable; /** * qwp123 2019/8/25 22:10 */ public class comparableComparator { /** * @desc "Comparator"和“Comparable”的比较程序。 * (01) "Comparable" * 它是一个排序接口,只包含一个函数compareTo()。 * 一个类实现了Comparable接口,就意味着“该类本身支持排序”,它可以直接通过Arrays.sort() 或 Collections.sort()进行排序。 * (02) "Comparator" * 它是一个比较器接口,包括两个函数:compare() 和 equals()。 * 一个类实现了Comparator接口,那么它就是一个“比较器”。其它的类,可以根据该比较器去排序。 * <p> * 综上所述:Comparable是内部比较器,而Comparator是外部比较器。 * 一个类本身实现了Comparable比较器,就意味着它本身支持排序

自定义实体类支持多字段排序的排序器

假装没事ソ 提交于 2019-11-28 07:15:34
前言 对于基本类型的集合排序,可以直接借助java提供的排序器进行比较排序,而对于集合中的实体类,想要实现排序需要自定义排序器,常见的有两种方式: 一、实体类实现Comparator接口的compare方法进行排序 二、将比较器抽离出来,生成一个通用的比较器(比较常用) 记录一下第二种的用法 构建一个反射工具,用于根据传入的字段名的字符串解析出想要进行的排序的字段 public class ReflexUtil { static Logger logger = LoggerFactory.getLogger(ReflexUtil.class); //getMethod static public Object invokeMethod(String propertiesName, Object object) { try { if(object==null) return null; //如果传入的字段名不包含. 说明是一个单纯的字段,直接返回get方法执行的结果 if (!propertiesName.contains(".")) { String methodName = "get"+getMethodName(propertiesName); Method method = object.getClass().getMethod(methodName); return