精华内容
下载资源
问答
  • 明显第2种的红色3排完序后相对位置并没有变化 为什么要有稳定排序? 电商里面订单排序:首先会按金额从小到大排,金额相同的按下单时间。我从订单中心过来的时候已经按照时间排好序了。如 8:01 65 20:05 30 21

    插入排序,希尔排序,归并排序层层递进的方式进行解读


    评判一个算法的好坏

    1.时间效率
    2.空间复杂度
    3.比较次数&交换次数
    4.稳定性

    排序肯定会牵涉比较,排序的稳定性是:相同的数据排完序后相对位置不变。
    在这里插入图片描述
    明显第2种的红色3排完序后相对位置并没有变化

    为什么要有稳定排序?

    电商里面订单排序:首先会按金额从小到大排,金额相同的按下单时间。我从订单中心过来的时候已经按照时间排好序了。如
    8:01 65
    20:05 30
    21:10 30
    22:01 45

    选择某个算法:如果选择不稳定的排序算法 那还要比较两次的,如果选择稳定的排序算法 那就只要比较一个字段


    一、插入排序

    其实插入排序就是我们平时的打扑克,每次选一张牌插入到已排好序的牌里。

    假设有个这样的问题:打扑克。分成两部分:一部分是你手里的牌(已经排好序),一部分是要拿的牌(无序)。把一个无序的数列一个个插入到有序数列中。
    一个有序的数组,我们往里面添加一个新的数据后,如何继续保持数据有序呢?我们只要遍历数组,找到数据应该插入的位置将其插入即可。
    图演示:
    在这里插入图片描述

    以上这种往一个有序的集合里面插入元素,插入后序列仍然有序这就是插入排序算法思路。理解起来不难吧。那么插入排序具体是怎么实现呢?
    具体步骤如下:

    1. 将数组分成已排序段和未排序段。初始化时已排序端只有一个元素
    2. 到未排序段取元素插入到已排序段,并保证插入后仍然有序
    3. 重复执行上述操作,直到未排序段元素全部加完。

    时间复杂度: O(n²)

    注意:

    插入排序中,当待排序数组是有序时,是最优的情况,只需当前数跟前一个数比较一下就可以了,这时一共需要比较 N-1 次,时间复杂度为 O(N)。最坏的情况是待排序数组是逆序的,此时需要比较次数最多,最坏的情况是 O(n²)。

    空间复杂度为常数阶 O(1)

    可以用1个数组来实现,代码:

    public class InsertSort {
        public static void main(String[] args) {
            int a[]={9,8,7,0,1,3,42,2};
            int n=a.length;
            insertSort(a,n);
        }
        public static  int[] insertSort(int a[],int n){
            //第一个不用排序
            for (int i = 1; i < n ; i++) {
                int data=a[i];
                int j=i-1;
                //对i之前的数据进行排序,使之变为排好序的数组
                for (;j>=0;j--){
                    if(data<a[j]){
                        a[j+1]=a[j];
                    }else {
                        break;
                    }
                }
                //j=0,j--变为了-1,所以需要变为j+1进行交换
                a[j+1]=data;
            }
    
            return a;
        }
    }
    

    时间复杂度最好的情况,通过代码可以看出是O(n),那么我们可以通过让break越多,则时间复杂度就是O(n)了,由此引出希尔排序

    二、希尔排序

    插入排序是分成2段,一段是排好序的,一段是未排好序的。那么希尔排序采取了增量的形式
    在这里插入图片描述
    增量分别按5,2,1进行分段排序

    代码如下:

    public class ShellSort {
    	public static void main(String[] args) {
    		int a[] = { 9, 8, 7, 0, 1, 3, 2 };
    		int n = a.length;
    
    		for (int add = n / 2; add >= 1; add /= 2) {
    			for (int i = add; i < n; i++) {
    				int data = a[i];
    				int j = i - add;
    				for (; j >= 0; j-= add) {// 从尾到头 1+2+3+4+5+...+n=>
    					if (a[j] > data) {
    						a[j + add] = a[j]; // 数据往后移动
    					} else { // 因为前面已经是排好序的 那么找到一个比他小的就不用找了,因为前面的肯定更小
    						break; 
    					}
    				}
    				a[j + add] = data;
    			}
    		}
    
    	}
    }
    

    可以看到每段的排序都是插入排序,最外层的循环就是分段。最后增量为1的时候很多都是已排好序的了,break执行的越来越多。

    在这里插入图片描述


    三、归并排序

    在这里插入图片描述
    每次从中间分开,分到最后只有1个数字的时候,分治的思想。一个序列可以分logn次,合并的时候会有n次排序,

    原因就是插入排序往有序的插入的原理,通过上面的代码我们知道左边的肯定有序了,所以一定是最好的情况O(n)

    所以最终时间复杂度是nlogn。代码实现,此种方式借助了临时数组。

    public class MegrSort {
    	public static void main(String[] args) {
    
    		int data[] = { 9, 5, 6, 8, 0, 3, 7, 1 };
    		megerSort(data, 0, data.length - 1);
    		System.out.println(Arrays.toString(data));
    		//JDK里面的排序源码
    
    	}
    
    	public static void megerSort(int data[], int left, int right) { // 数组的两端
    		if (left < right) { // 相等了就表示只有一个数了 不用再拆了
    			int mid = (left + right) / 2;
    			megerSort(data, left, mid);
    			megerSort(data, mid + 1, right);
    			// 分完了 接下来就要进行合并,也就是我们递归里面归的过程
    			meger(data, left, mid, right);
    		}
    	}
    
    	public static void meger(int data[], int left, int mid, int right) {
    		int temp[] = new int[data.length];		//借助一个临时数组用来保存合并的数据
    		
    		int point1 = left;		//表示的是左边的第一个数的位置
    		int point2 = mid + 1;	//表示的是右边的第一个数的位置
    		
    		int loc = left;		//表示的是我们当前已经到了哪个位置了
    		while(point1 <= mid && point2 <= right){
    			if(data[point1] < data[point2]){
    				temp[loc] = data[point1];
    				point1 ++ ;
    				loc ++ ;
    			}else{
    				temp[loc] = data[point2];
    				point2 ++;
    				loc ++ ;
    			}
    		}
    		//接下来要干嘛呢?合并排序完成 了吗?
    		while(point1 <= mid){
    			temp[loc ++] = data[point1 ++];
    		}
    		while(point2 <= right){
    			temp[loc ++] = data[point2 ++];
    		}
    		for(int i = left ; i <= right ; i++){
    			data[i] = temp[i];
    		}
    	}
    }
    

    注意按照这种写法
    在这里插入图片描述
    最后的9是没有到新数组里的,所以需要这俩句话

    while(point1 <= mid){
    			temp[loc ++] = data[point1 ++];
    }
    while(point2 <= right){
    	temp[loc ++] = data[point2 ++];
    }
    
    • 空间复杂度O(n)
    • 时间复杂度是nlogn
    • 稳定性:稳定

    稳定性总结

    • 插入排序:稳定的
    • 希尔排序:不稳定,因为不知道怎么分组的,就是增量取多少
    • 归并排序:稳定,其实就是对插入排序的优化,最后合的过程就是对插入排序的优化
    展开全文
  • 每次自己回想起大学上《数据结构》课程的时候,都感觉像是一场噩梦。脑海中浮现的都是复杂的数学公式、看不懂的C语言算法、抽象的递归等等。大学为了学分也只能硬着头皮完成了考试,然后就没有然后了,完全没记住学...
    • 目录

    前言

    结构和关系

    结构的变化

    数据结构

    查找

    排序

    总结

    知识点总结


     

    • 前言

    每次自己回想起大学上《数据结构》课程的时候,都感觉像是一场噩梦。脑海中浮现的都是复杂的数学公式、看不懂的C语言算法、抽象的递归等等。大学为了学分也只能硬着头皮完成了考试,然后就没有然后了,完全没记住学了些什么。工作以后,增删改查的业务模块中几乎没有看到数据结构中那些复杂的算法。于是慢慢的就忘记了还有数据结构这样噩梦般的知识。

    难道《数据结构》就是大学老师为了折磨我们而必修的一门课程吗?

    答案肯定是否定的。其实开发工作中大量的使用了数据结构的知识,只是这些复杂的算法和实现过程都被开发工具给我们封装好了。比如数据库的查询和索引,JDK的容器API,JVM中的堆和栈、MQ的消息队列等等。

     

    那么我们还有必要学习数据结构知识吗?

    答案是肯定的。

    1、数据结构的逻辑模型能让我们设计的系统架构更加合理;

    2、数据结构的逻辑模型能让我们业务模型更加简单;

    3、数据结构的物理模型能让我们利用内存空间更加高效;

    4、数据结构的算法能提升程序的执行效率,节省CPU消耗,提升用户体验,支持更多并发请求等等;

     

    数据结构有这么多好处,是编程能力的核心技能。那么就让我们来好好的重新认识它。大家对数据结构的恐惧主要是算法的细节和实现,所以咱们先屏蔽算法实现,只讨论逻辑概念和它能解决什么问题。

     

    • 结构和关系

    在研究数据结构之前,咱们先要补充结构相关的概念。什么是结构呢?科学的定义太抽象咱们就不讨论了。日常生活中接触到的结构有建筑结构、化学结构、汽车结构、知识结构等。化学结构是指元素之间的关系。汽车结构是指组件之间的关系。那么我们可以简单的理解结构就是元素之间的关系。“元素”在不同的领域指代的事物不一样。我们看到的这些结构都非常复杂,组件元素很复杂,元素之间关系也很复杂。那么我们怎么去研究呢?复杂的元素都是由最简单的基本元素组成的;复杂的关系都是由最简单的基本关系组成的。所以我们应该从这些基础元素和基础关系入手。由于元素是变化的,因此我们主要研究结构的关系而不是元素。

     

    通过人们的研究,总结出了四种结构的逻辑关系。

    1、集合结构,表示元素之间的平等关系;

    2、线性结构,表示元素之间的一对一关系;

    3、树形结构,表示元素之间的一对多关系;

    4、图形结构,表示元素之间的多对多关系。

     

    这些结构都是怎么总结出来的呢?咱们还是先找找对应的结构案例来看看。

    集合结构,相当于人类最原始的部落,大家住在同一个村落中。如果跟其他部落打架,大家就一起上,看谁更勇敢。

    线性结构,后来大家商量不要群殴了,咱们就各派3个人出来玩KOF,一对一单挑。3个人出场顺序就是线性结构。如果是排前面的先出场,就是队列结构,先进先出。如果是排后面的先出场,就是栈结构,先进后出。咱们中国历史上经典的“田忌赛马”,就是这个原理。

    树形结构,再后来部落人数越来越多了,打架就不好操作了。于是人们想出了军队的概念,5个人一个班,3个班一个排,3个排一个连,后面还有营、团、旅、师、军,大家感兴趣可以去百度一下。这样的军队结构就是一个树形结构,表示一对多的关系。

    图形结构,有了军队以后,大家打架就不是简单的互殴了,要根据地形讲究战略战术。那么怎么表示各个部落之间的位置和路线呢?一个部落到其他部落是有多条路线的,这些信息组成了地图。这种网状结构就是图形结构,表示多对多的关系。

    • 结构的变化

    现在我们已经搞清楚了结构和关系,但是结构并不是始终不变的。它是会根据元素的变化做出相应的变化。我们下面就来看看结构都有哪些变化?总的来说结构变化有3种情况,增加元素、删除元素、修改元素。

     

    咱们前面了解的四种逻辑结构对三种变化进行的操作是不一样的。修改只是元素自身变化,不影响结构,咱们就只研究增加和删除。集合结构,由于元素是平等关系,增加和删除元素对结构没有影响,只要集合的空间足够就行。线性结构,树形结构和图形结构中任何元素的增加和删除都会对结构造成影响。由于咱们这里篇幅有限,就不展开讨论增加和删除操作对4种结构的影响了。

     

    • 数据结构

    前面铺垫了这么久,就是为了让大家先对数据结构的重要性和基本概念有个感性认识。总结起来内容不多,我们知道了四种逻辑结构和三种元素变化。那么接下来我们就要看看在计算机的世界里面,该如何表示这些逻辑结构和元素变化呢?我们需要补充一下数据结构的计算机概念。

     

    数据结构中的元素叫做数据元素。数据元素有多个数据子项。例如数据库的记录和字段。

    我们把逻辑结构在计算机的表示方式叫做物理结构。有两种物理结构:顺序存储结构、链式存储结构。

    顺序存储结构,连续的内存空间来保存元素。例如数组。

    链式存储结构,元素之间物理位置不连续,每个元素需要额外存储下一个元素的物理地址。例如链表。

     

    数据结构要研究的内容就是怎么用这两种物理结构来表示四种逻辑结构,并且要实现元素变化的结构操作。这些知识非常的复杂和枯燥,大家可以先跳过,只关心JDK已经封装好的API就好。然后在掌握了API的使用方法之后,再慢慢的去看底层实现原理。这样有的放矢的学习要轻松很多,而且还可以边做实验变理解。

     

    我们还是把树形结构和图形结构的存储结构讲解一下。树形结构是一对多的关系,所以每个点都有子节点列表。第一个节点叫做根节点。一棵树就是从根节点开始,每个子节点又有自己的子节点,这样一直递归下去。递归的概念很抽象,我们这里只是简单理解为重复自己的结构或者逻辑。比如愚公移山中所说,父亲有儿子,儿子还有儿子,子子孙孙无穷尽也。图形结构有两种元素,节点和路径。图的物理结构也有两种方式,矩阵法和链表法。图的结构复杂并且应用场景非常特殊,咱们暂时先不展开讨论。

     

    这里做个提醒,数据结构中的集合和图跟JDK中的Collect和Map是两回事。大家在学习的时候要注意一下,别弄混了。

    我把它们的对应关系做了梳理,大家可以参考一下。

    集合结构:Set、Map、HashMap、TreeMap

    线性结构:数组、List、ArrayList、LinkedList(队列和栈)

    树形结构和图形结构:需要自己实现。

    集合工具:Collections、Arrays

     

    • 查找

    数据结构的实现不是我们需要关心的重点,相信大家在学习开发语言的时候就掌握得很好了。我们主要关心的内容是数据结构的遍历、排序和查找算法。我们还是老规矩需要补充新的概念,算法。

     

    算法是解决问题的求解步骤。或者叫解决问题的方法。

    算法有五个特性:输入、输出、有穷性、确定性、可行性。

    算法有五个要求:正确性、可读性、健壮性、执行效率高、使用空间少。

     

    解释一下算法的五个特性和五个要求,特性是定义什么是算法,要求是定义什么是好算法。

    算法特性很好理解,就是编程语言中的方法。这里的输入和输出指逻辑上的概念,不是语法上方法的参数和返回值,我觉得可以理解成数据和结果。有穷性就是说不能有死循环。确定性和可行性是说每条指令都是计算机可以执行的,不是程序伪码。

    算法要求更加实在一些,就是咱们的代码规范。正确性和健壮性要求不能有BUG。可读性要求人能轻松看懂代码逻辑。效率和空间就是要求算法要精妙,衍生出了一个新概念叫算法复杂度。算法复杂度有时间和空间两个维度,我们一般只讨论时间维度。算法复杂度就是算法使用的指令条数。这样我们就能对一个算法的效率做出评判标准了。在数据结构理论中算法复杂度的公式很复杂,主要依靠数学归纳推理的方式,这里就不展开讨论了。

     

    有了算法之后,咱们第一个算法就来研究一下遍历算法。遍历算法就是将结构中的所有元素都访问一次。四种结构的遍历方法是不一样的。集合结构和线性结构的逻辑结构不复杂,物理结构直接顺序访问就可以了。树形结构和图形结构有层级关系,所以物理结构不是逻辑结构。产生了两种遍历方式,深度优先和广度优先。深度优先是优先遍历上下级关系,广度优先是优先遍历同级关系。这里又使用到了递归的概念。

     

    我们主要关心线性结构和树形结构的遍历算法。线性结构遍历算法太简单,所以我们主要讨论树形结构遍历算法。树的遍历算法就是使用递归的方式,从根节点出发,重复遍历其子节点。有一种特殊的树叫二叉树,就是每个节点最多只有两个子节点。二叉树有很多特殊性质,大家自己慢慢研究。它最主要的特性在编码、排序和查找三个方面非常有用。所以我们需要重点学习二叉树的遍历算法。二叉树遍历有四种方式:前序遍历、中序遍历、后序遍历、层级遍历。分别对应了节点和子节点的输出顺序。

     

    好了,我们讨论了这么久的算法和遍历,最终的目的是为了说明查找算法。在计算机程序中,查找数据结构中一个指定数据,这种需求非常多。比如在一个班级中查看张三的成绩。现实世界中,我们可以找到班主任,然后班主任在一堆学生成绩单中,顺序查找到张三的成绩。这种方式就是遍历查找,它有一个缺点,就是比较慢。如果成绩单按分数来进行排名,而我们知道张三的名次,老师查找成绩可以先拿中间的成绩,如果比张三名次高,老师再下半区间再取中间的成绩,这样逐步缩小查找范围,很快就能查找到张三的成绩。这种查找方式就是折半查找,前提需要数据元素是有序的。还有一种情况,老师能记住每个同学的成绩,直接通过张三的名字就立即知道了成绩。这种查找方式就是散列查找,每个成绩都有一个别名,直接返回结果。

     

    总结一下查找算法有三种:遍历查找、折半查找、散列查找。遍历查找就是用遍历算法一个一个的查找。折半查找要求数据元素是有序的。散列查找要求每个元素有一个别名,就是我们常用的HashMap。

     

    • 排序

    我们已经理解了数据结构的逻辑结构、物理结构、结构变化、数据查找。数据查找中高效的折半查找算法要求数据元素是有序排列的,所以我们需要进一步研究如何进行排序。这里为了讨论方便,排序的数据元素是数字。因为数据元素由多个数据子项组成,只要有一个子项是数字就可以了。数字的排序就是指按数字大小进行升序或降序。

     

    逻辑上我们要给10个数字进行排序,先找出最大值,然后在剩下的9个元素中再找出最大值,这样一直循环找出所有最大值。我们找10轮最大值就完成了对10个数字的排序,这种排序方法就是经典的冒泡排序。看上去也不是很难,但是事情往往没有我们表面上看到的这么简单。冒泡排序对数据量小的情况下非常好用,如果数据量达到上百万、上千万这样的情况时,就暴露了效率低下的问题,排序非常慢。

     

    于是很多聪明的计算机大神们就开始寻找更加高效的排序算法。最终人们找到了一种快速排序算法,它能很好的解决这种大数据量的排序工作。我们简单的理解一下快速排序,它的主要思想是把数据通过平分的方式来缩小排序规模。怎么平分呢?还是刚刚10个数字的例子,先找出10个数字的中间值。我们就假设10个数字就是1到10,中间值就是5,小于5的分为A组,大于5的分为B组,AB两组中的元素是乱序的。我们再递归循环这样的过程,不停的再把AB组拆分成A1、A2和B1、B2。最终我们就能获得排序后的数据了。

     

    快速排序的算法实现,大家自己慢慢研究。我们掌握这两种排序就可以了,冒泡排序和快速排序。我们要明白排序是为了查找效率更高。

     

    • 总结

    数据结构是一门非常复杂的学科,它涉及了多个学科的知识,比如数学、计算机硬件、编程、逻辑学等。所以数据结构要深入研究很难,特别是改进算法和创造算法。还好我们作为程序员主要的任务是解决业务问题,只需要理解逻辑上的数据结构和算法原理,能合理的运用已有的API工具就行了。在面对这种抽象的知识时,我们应该先从宏观上了解知识的概念,暂时不要关心证明和实现的过程,然后在掌握了已有知识工具的前提下,再回头来看看底层的原理。为了大家方便记忆数据结构的核心概念,我在下面做了知识点的总结。

     

    • 知识点总结

    数据结构的研究内容:逻辑结构、存储结构、操作(算法)。

    逻辑结构有四种类型:集合结构、线性结构、树形结构、图形结构。

    物理结构有两种类型:顺序存储、链式存储。

     

    集合结构:哈希算法、无序、不重复。

    线性结构:数组、链表、队列、栈。

    树形结构:二叉树、深度优先、广度优先、递归。

    图形结构:最短路径、关键路径。

     

    数据关系

    • 集合结构中数据关系是平等关系。
    • 线性结构中数据关系是一对一关系。
    • 树形结构中数据关系是一对多关系。
    • 图形结构中数据关系是多对多关系。

     

    数据操作类型:插入、删除、修改、查询、排序。

     

    算法是解决问题的求解步骤。或者叫解决问题的方法。

    算法有五个特性:输入、输出、有穷性、确定性、可行性。

    算法有五个要求:正确性、可读性、健壮性、执行效率高、使用空间少。

     

    查询算法:遍历查找、折半查找、散列查找。

    排序算法:冒泡排序、快速排序。

    展开全文
  • 我的问题是,为什么冒泡排序和选择排序在对数组进行逆序排序的时候花的时间比对随机数组进行排序所花的时间少呢? [code="java"]import java.util.Random; public class ArrayUtil { public static void ...
  • 排序时候 调用sortchange钩子函数,然后会触发initsort方法,我本想让第一行不出现上移图片(强制把排序图片更新,没成功),但是table数据变化了,但是页面没有变化!请问为什么会这样?系统首页音频分集...

    当排序时候 调用sortchange钩子函数,然后会触发initsort方法,我本想让第一行不出现上移的图片(强制把排序后的图片更新,没成功),但是table的数据变化了,但是页面没有变化!请问为什么会这样?

    系统首页

    音频分集

    分集列表(3集)

    :data="tableData"

    @sort-change = 'sortchange'

    style="width: 100%">

    prop="id"

    label="编号"

    sortable

    width="220%"

    >

    prop="audioName"

    label="音频名称"

    sortable

    width="220%">

    prop="format"

    label="格式"

    width="220%">

    prop="format"

    label="格式"

    width="220%">

    prop="quantity"

    label="阅读量"

    sortable

    width="220%">

    import Vue from 'vue'

    import downimg from '@/assets/xiayi.png'

    import upimg from '@/assets/shangyi.png'

    export default {

    name: "video-diversity",

    created(){

    this.initsort()

    },

    data() {

    return {

    audioname: '',

    tableData: [

    {

    id: '100001',

    audioName: '001-走向中考考场·七年级道德与法治',

    format: 'MP3',

    size: '10M',

    quantity: 23434,

    downimg: downimg,

    upimg: upimg,

    }, {

    id: '100002',

    audioName: '003-走向中考考场·七年级道德与法治',

    format: 'MP3',

    size: '10M',

    quantity: 4534,

    downimg: downimg,

    upimg: upimg,

    }, {

    id: '100003',

    audioName: '005-走向中考考场·七年级道德与法治',

    format: 'MP3',

    size: '10M',

    quantity: 45340,

    downimg: downimg,

    upimg: upimg,

    }

    ],

    }

    },

    methods: {

    search() {

    console.log(this.audioname);

    },

    sortchange(obj){

    this.initsort()

    },

    initsort(){

    Vue.set(this.tableData[0], 'upimg', '')

    Vue.set(this.tableData[this.tableData.length-1], 'downimg', '')

    this.tableData = this.tableData.filter(function (item) {

    console.log(item);

    return item

    })

    },

    downclick(a,b,c){

    console.log(a);

    },

    upclick(){

    }

    },

    watch:{

    'tableData':function (newval,oldval) {

    console.log(newval);

    },

    },

    beforeUpdate(){

    // debugger

    Vue.set(this.tableData[0], 'upimg', '')

    Vue.set(this.tableData[this.tableData.length-1], 'downimg', '')

    }

    }

    展开全文
  • 排序时候 调用sortchange钩子函数,然后会触发initsort方法,我本想让第一行不出现上移图片(强制把排序图片更新,没成功),但是table数据变化了,但是页面没有变化!请问为什么会这样?系统首页音频分集...

    当排序时候 调用sortchange钩子函数,然后会触发initsort方法,我本想让第一行不出现上移的图片(强制把排序后的图片更新,没成功),但是table的数据变化了,但是页面没有变化!请问为什么会这样?

    系统首页

    音频分集

    分集列表(3集)

    :data="tableData"

    @sort-change = 'sortchange'

    style="width: 100%">

    prop="id"

    label="编号"

    sortable

    width="220%"

    >

    prop="audioName"

    label="音频名称"

    sortable

    width="220%">

    prop="format"

    label="格式"

    width="220%">

    prop="format"

    label="格式"

    width="220%">

    prop="quantity"

    label="阅读量"

    sortable

    width="220%">

    import Vue from 'vue'

    import downimg from '@/assets/xiayi.png'

    import upimg from '@/assets/shangyi.png'

    export default {

    name: "video-diversity",

    created(){

    this.initsort()

    },

    data() {

    return {

    audioname: '',

    tableData: [

    {

    id: '100001',

    audioName: '001-走向中考考场·七年级道德与法治',

    format: 'MP3',

    size: '10M',

    quantity: 23434,

    downimg: downimg,

    upimg: upimg,

    }, {

    id: '100002',

    audioName: '003-走向中考考场·七年级道德与法治',

    format: 'MP3',

    size: '10M',

    quantity: 4534,

    downimg: downimg,

    upimg: upimg,

    }, {

    id: '100003',

    audioName: '005-走向中考考场·七年级道德与法治',

    format: 'MP3',

    size: '10M',

    quantity: 45340,

    downimg: downimg,

    upimg: upimg,

    }

    ],

    }

    },

    methods: {

    search() {

    console.log(this.audioname);

    },

    sortchange(obj){

    this.initsort()

    },

    initsort(){

    Vue.set(this.tableData[0], 'upimg', '')

    Vue.set(this.tableData[this.tableData.length-1], 'downimg', '')

    this.tableData = this.tableData.filter(function (item) {

    console.log(item);

    return item

    })

    },

    downclick(a,b,c){

    console.log(a);

    },

    upclick(){

    }

    },

    watch:{

    'tableData':function (newval,oldval) {

    console.log(newval);

    },

    },

    beforeUpdate(){

    // debugger

    Vue.set(this.tableData[0], 'upimg', '')

    Vue.set(this.tableData[this.tableData.length-1], 'downimg', '')

    }

    }

    回答

    vue 数组更新检测

    不好意思中午扫了一眼你的问题感觉可能是数组更新没有检测到的原因就强答了,刚才实际测试了一下,实际上你这样写是可以触发更新的,具体你不行的原因因为代码不全没有办法分析

    看过你的代码了,你只是启用sortable并没有把sortable设置为custom启用自定义排序,这个情况下其实el-table并没有改变你tableData的排序顺序,所以这个样子当然实现不了头尾隐藏的效果

    这样给你提供一种比较简单的实现思路,直接通过当前列的index判断是否是第一行或最后一行就行了

    这个实现方式可以把downimg和upimg放在data里面,不用每个数据都赋值,更科学,节约内存

    data() {

    return {

    downimg: downimg,

    upimg: upimg,

    audioname: '',

    tableData: [

    https://github.com/livelyPeng… 流畅渲染万级数据并不会影响到 element-ui el-table组件的原有功能,并且新增了一些功能

    展开全文
  • 然后我就试了一下第二者,发现如果函数deleteDuplication处理完毕后,如果以形参形式传入的根节点pHead没有发生改变,则在main()函数里打印出链表的时候,链表和处理前的不一样了(即发生了改变);但如果根节点发生...
  • 你必须知道495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    1.2 为什么不精确定义标准类型大小? 1.3 因为C语言没有精确定义类型大小,所以我一般都用typedef定义int16和int32。然后根据实际机器环境把它们定义为int、short、long等类型。这样看来,所有问题都解决...
  • 1.2 为什么不精确定义标准类型大小? 2 1.3 因为C语言没有精确定义类型大小,所以我一般都用typedef定义int16和int32。然后根据实际机器环境把它们定义为int、short、long等类型。这样看来,所有问题都...
  • 《你必须知道495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    1.24 我在一个文件中定义了一个extern数组,然后在另一个文件中使用,为什么sizeof取不到数组大小? 13 声明问题 14 1.25 函数只定义了一次,调用了一次,但编译器提示非法重声明了。 14 *1.26 main正确...
  • 为什么要有GC?  GC是垃圾收集意思(Gabage Collection),内存处理是编程人员容易出现问题地方,忘记或者错误内存回收会导致程序或系统不稳定甚至崩溃,Java提供GC功能可以自动监测对象是否超过作用域...
  • 你必须知道495个C语言问题(PDF)

    热门讨论 2009-09-15 10:25:47
    当我向p[i] 赋值的时候, 我的程序崩溃了。. . . . 5 1.14 我总算弄清除函数指针的声明方法了, 但怎样才能初始化呢? . . 5 2 结构、联合和枚举7 2.1 声明struct x1 f . . . g; 和typedef struct f . . . g x2; 有...
  • 为什么需要树?当在面临大量输入数据时,线性表访问时间就变很慢了,有没有一种数据结构可以加速访问呢,树就是其中一种,树可以将大部分操作都优化到 O(logn) 时间复杂度&...
  • 3.2.2 为什么一个图像集合自协方差矩阵对角化定义了描述集合中图像所需基? 147 3.2.3 如何变换一幅图像以使其自协方差矩阵成为对角? 149 3.2.4 如果系综相对于自相关是平稳,一组图像系综自相关矩阵...
  • div">另外,区别是回调还是模板方法,还有一个很重要依据,你所变化的类是不是具有"一次性特征",思考一下comparable接口,为什么不设计在list之上?因为list里元素排序方式单一性一次性,比如这次按价格排序只代表这次...
  • studioone4_6283.dmg

    2019-05-13 22:11:30
    简单易用midi映射,卓越音质,无限制音轨数及每轨无限插件数,支持各种最新技术规格便利起始页面,化繁简,能通过更简单方式来录制音频及进行midi制作.这款软件是在其核心易于使用情况下设计。它...
  •  2009年8月,我们终于完成了这本书组稿、编辑工作,可以将它呈现给大家,在这里我想和大家分享一下为什么会有这本书,以及这本书来龙去脉。  一、选题及出发  在2008年底,我修订了《深入浅出Oracle》一书...
  • 如果你有什么中立观点(比如说没有被SUN和Microsoft百万美金所影响),请顺便通知我。 据我所知,JSP基于Java,因此Java程序员可以轻松开始编码。ASP只是一个一般引擎,具有支持多种语言能力,不过默认...
  • 大话数据结构

    2018-12-14 16:02:18
    想想看,在你准备用枪的时候,突然这手枪明明有子弹却打不出来,这不是要命吗。 4.2栈的定义 89 类似的很多软件,比如word、photoshop等,都有撤消(undo)的操作,也是用栈这种思想方式来实现的。 4.2.1栈的定义...
  • java基础题 很全面

    2009-05-09 09:24:24
    以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题。 31 6. 写一段Jdbc连Oracle的程序. 32 7. 编码实现内部类 34 8. 输入n个数字,以逗号,分开;然后可选择升或者降序排序;按提交键就在另一页面显示按...
  • sql总结.doc

    2019-08-27 22:08:51
    2.对表中的数据进行增、删、改的时候,索引也要动态的维护,这就降低了整数的维护速度。 (7)索引的建立原则 1.主外键 2.经常被查询的列 3.用于连接的字段 4.排序分组的字段 2、存储过程 (1)什么是存储过程? ...

空空如也

空空如也

1 2 3 4 5
收藏数 83
精华内容 33
关键字:

为什么排序的时候没有变化