java中的各种排序案例

合集下载

java中List按照date排序的实现

java中List按照date排序的实现
}
排序我们要用到java里面的Collections类和Comparator<T>接口,具体用法查看API:
Collections.sort(resultList, new Comparator<Leavecalendar>() {
@Override public int compare(Leavecalendar o1, Leavecalendar o2) { int flag = o1.getDate().compareTo(o2.getDate()); return flag; } });
里面比较日期用了compareTo,对于日期来说还有before和after,应该可以做到升序和降序排列日期,写完后感觉这可以写一 个工具类来满足各种比较。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
这篇文章主要介绍了intellijidea201911formac下载和注册码激活教程本文通过图文并茂的形式给大家介绍的非常详细对大家的学习或工作具有一定的参考借鉴价值需要的朋友可以参考下
java中 List按照 date排序的实现
java 中List按照date排序的实现
今天开发需要对一个list进行排序码。
Leavecalendar这个bean类里面有属性date;
private Date Date; //有get/set方法;
public Date getDate() { return Date;
}
public void setDate(Date lcDate) { this.Date = lcDate;

java8streamsort自定义复杂排序案例

java8streamsort自定义复杂排序案例

java8streamsort⾃定义复杂排序案例java 8 ⾃定义排序需求今天在项⽬中遇到个需求,按照对象中的三个属性进⾏排序。

具体要求:前提:对象 Obj [a=a,b=b,c=c]1、优先级为a > b > c2、 a属性为中⽂,固定排序规则为:政府,合作,基⾦ … …3、 b的为BigDecimal类型,固定的排序规则为:降序排序4、 c为java.util.Date类型,规则为:降序排序其实看这个需求,第3点和第4点不是什么问题,但是第1点,会考虑下怎么实现好。

直接上⽅案吧!⽅案⼀新建⼀张排序表,⾄少要有字段【名称—中⽂名称(政府、合作、基⾦等)】【排序编号—(1、2、3)】,在Obj表中的a字段存排序表的id。

此时可以直接⽤sql语句 ORDER BY 排序即可。

优点:可动态配置。

⽅案⼆完全⽤java代码操作,和sql⽆关,上代码:Obj.java 和 Sort.javapackage TestSort;import java.math.BigDecimal;public class Obj {private String name;private BigDecimal price;public Obj(String name, BigDecimal price){ = name;this.price = price;}public Obj(){}public String getName() {return name;}public void setName(String name) { = name;}public BigDecimal getPrice() {return price;}public void setPrice(BigDecimal price) {this.price = price;}@Overridepublic String toString() {return "Obj [name=" + name + ", price=" + price + "]";}}package TestSort;import java.math.BigDecimal;import java.util.Arrays;import parator;import java.util.List;import java.util.stream.Collectors;public class Sort {public static void main(String[] args) {List<Obj> list = Arrays.asList(new Obj("政府", null),new Obj("政府", new BigDecimal("1216.23")),new Obj("商业", new BigDecimal("123.23")),new Obj("PPD", new BigDecimal("123.23")),new Obj("合作", new BigDecimal("127.23")),new Obj("合作", new BigDecimal("125.23")),new Obj("咨询", null),new Obj(null, null));/*Comparator<Obj> byName = paring(Obj::getName).reversed();Comparator<Obj> finalByPrice= byName.thenComparing(Obj::getPrice,Comparator.nullsFirst(BigDecimal::compareTo)).reversed();List<Obj> result = list.stream().filter(new Predicate<Obj>() {@Overridepublic boolean test(Obj obj) {if(obj.getName() == null && obj.getPrice() ==null){return false;}return true;}}).sorted(finalByPrice).collect(Collectors.toList());*/List<Obj> result = list.stream().sorted(//先按照name排序(模拟需求的a属性排序)paring(Obj::getName,(x,y)->{if(x == null && y != null){return 1;}else if(x !=null && y == null){return -1;}else if(x == null && y == null){return -1;}else if("PPD".equals(x) || "PPD".equals(y)){if(x.equals(y)){return 0;}else if("PPD".equals(x)){return -1;}else{return 1;}}elseif("合作".equals(x) || "合作".equals(y)){if(x.equals(y)){return 0;}else if("合作".equals(x)){return -1;}else{return 1;}}elseif("政府".equals(x) || "政府".equals(y)){if(x.equals(y)){return 0;}else if("政府".equals(x)){return -1;}else{return 1;}}return 0; })//再按照其他字段排序,要考虑null(模拟需求b和c字段排序).thenComparing(paring(Obj::getPrice,Comparator.nullsFirst(BigDecimal::compareTo)).reversed())).collect(Collectors.toList());System.out.println(result);System.out.println(result.size());}}⽅案⼆的缺点就是硬编码,⽤户改排序就得改源码。

java的几种排序方式

java的几种排序方式

java的几种排序方式用Java语言实现的各种排序,包括插入排序、冒泡排序、选择排序、Shell排序、快速排序、归并排序、堆排序、SortUtil等。

插入排序:package org.rut.util.algorithm.support;import org.rut.util.algorithm.SortUtil;/*** @author treeroot* @since 2006-2-2* @version 1.0*/public class InsertSort implements SortUtil.Sort{/* (non-Javadoc)* @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])*/public void sort(int[] data) {int temp;for(int i=1;i for(int j=i;(j>0)&&(data[j] SortUtil.swap(data,j,j-1);}}}}冒泡排序:package org.rut.util.algorithm.support;import org.rut.util.algorithm.SortUtil;/*** @author treeroot* @since 2006-2-2* @version 1.0*/public class BubbleSort implements SortUtil.Sort{/* (non-Javadoc)* @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])*/public void sort(int[] data) {int temp;for(int i=0;i for(int j=data.length-1;j>i;j--){if(data[j] SortUtil.swap(data,j,j-1);}}}}}选择排序:package org.rut.util.algorithm.support;import org.rut.util.algorithm.SortUtil;/*** @author treeroot* @since 2006-2-2* @version 1.0*/public class SelectionSort implements SortUtil.Sort { /** (non-Javadoc)** @see org.rut.util.algorithm.SortUtil.Sort#sort(int[]) */public void sort(int[] data) {int temp;for (int i = 0; i < data.length; i++) {int lowIndex = i;for (int j = data.length - 1; j >i; j--) {if (data[j] < data[lowIndex]) {lowIndex = j;}}SortUtil.swap(data,i,lowIndex);}}}Shell排序:package org.rut.util.algorithm.support;import org.rut.util.algorithm.SortUtil;/*** @author treeroot* @since 2006-2-2* @version 1.0*/public class ShellSort implements SortUtil.Sort{/* (non-Javadoc)* @see org.rut.util.algorithm.SortUtil.Sort#sort(int[]) */public void sort(int[] data) {for(int i=data.length/2;i>2;i/=2){for(int j=0;j insertSort(data,j,i);}}insertSort(data,0,1);/*** @param data* @param j* @param i*/private void insertSort(int[] data, int start, int inc) {int temp;for(int i=start+inc;i for(int j=i;(j>=inc)&&(data[j] SortUtil.swap(data,j,j-inc); }}}}快速排序:package org.rut.util.algorithm.support;import org.rut.util.algorithm.SortUtil;/*** @author treeroot* @since 2006-2-2* @version 1.0*/public class QuickSort implements SortUtil.Sort{/* (non-Javadoc)* @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])*/public void sort(int[] data) {quickSort(data,0,data.length-1);}private void quickSort(int[] data,int i,int j){int pivotIndex=(i+j)/2;//swapSortUtil.swap(data,pivotIndex,j);int k=partition(data,i-1,j,data[j]);SortUtil.swap(data,k,j);if((k-i)>1) quickSort(data,i,k-1);if((j-k)>1) quickSort(data,k+1,j);}/*** @param data* @param i* @param j* @return*/private int partition(int[] data, int l, int r,int pivot) {while(data[++l] while((r!=0)&&data[--r]>pivot);SortUtil.swap(data,l,r);}while(l SortUtil.swap(data,l,r);return l;}}改进后的快速排序:package org.rut.util.algorithm.support;import org.rut.util.algorithm.SortUtil;/*** @author treeroot* @since 2006-2-2* @version 1.0*/public class ImprovedQuickSort implements SortUtil.Sort { private static int MAX_STACK_SIZE=4096;private static int THRESHOLD=10;/* (non-Javadoc)* @see org.rut.util.algorithm.SortUtil.Sort#sort(int[]) */public void sort(int[] data) {int[] stack=new int[MAX_STACK_SIZE];int top=-1;int pivot;int pivotIndex,l,r;stack[++top]=0;stack[++top]=data.length-1;while(top>0){int j=stack[top--];int i=stack[top--];pivotIndex=(i+j)/2;pivot=data[pivotIndex];SortUtil.swap(data,pivotIndex,j);//partitionl=i-1;r=j;do{while(data[++l] while((r!=0)&&(data[--r]>pivot)); SortUtil.swap(data,l,r);}while(l SortUtil.swap(data,l,r);SortUtil.swap(data,l,j);if((l-i)>THRESHOLD){stack[++top]=i;stack[++top]=l-1;}if((j-l)>THRESHOLD){stack[++top]=l+1;stack[++top]=j;}}//new InsertSort().sort(data);insertSort(data);}/*** @param data*/private void insertSort(int[] data) {int temp;for(int i=1;i for(int j=i;(j>0)&&(data[j] SortUtil.swap(data,j,j-1); }}}}归并排序:package org.rut.util.algorithm.support;import org.rut.util.algorithm.SortUtil;/*** @author treeroot* @since 2006-2-2* @version 1.0*/public class MergeSort implements SortUtil.Sort{/* (non-Javadoc)* @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])*/public void sort(int[] data) {int[] temp=new int[data.length];mergeSort(data,temp,0,data.length-1);}private void mergeSort(int[] data,int[] temp,int l,int r){int mid=(l+r)/2;if(l==r) return ;mergeSort(data,temp,l,mid);mergeSort(data,temp,mid+1,r);for(int i=l;i<=r;i++){temp=data;}int i1=l;int i2=mid+1;for(int cur=l;cur<=r;cur++){if(i1==mid+1)data[cur]=temp[i2++];else if(i2>r)data[cur]=temp[i1++];else if(temp[i1] data[cur]=temp[i1++];elsedata[cur]=temp[i2++];}}}改进后的归并排序:package org.rut.util.algorithm.support;import org.rut.util.algorithm.SortUtil;/*** @author treeroot* @since 2006-2-2* @version 1.0*/public class ImprovedMergeSort implements SortUtil.Sort { private static final int THRESHOLD = 10;/** (non-Javadoc)** @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])*/public void sort(int[] data) {int[] temp=new int[data.length];mergeSort(data,temp,0,data.length-1);}private void mergeSort(int[] data, int[] temp, int l, int r) { int i, j, k;int mid = (l + r) / 2;if (l == r)return;if ((mid - l) >= THRESHOLD)mergeSort(data, temp, l, mid);elseinsertSort(data, l, mid - l + 1);if ((r - mid) >THRESHOLD)mergeSort(data, temp, mid + 1, r);elseinsertSort(data, mid + 1, r - mid);for (i = l; i <= mid; i++) {temp = data;}for (j = 1; j <= r - mid; j++) {temp[r - j + 1] = data[j + mid];}int a = temp[l];int b = temp[r];for (i = l, j = r, k = l; k <= r; k++) {if (a < b) {data[k] = temp;a = temp;} else {data[k] = temp[j--];b = temp[j];}}}/*** @param data* @param l* @param i*/private void insertSort(int[] data, int start, int len) {for(int i=start+1;i for(int j=i;(j>start) && data[j] SortUtil.swap(data,j,j-1); }}}}堆排序:package org.rut.util.algorithm.support;import org.rut.util.algorithm.SortUtil;/*** @author treeroot* @since 2006-2-2* @version 1.0*/public class HeapSort implements SortUtil.Sort{/* (non-Javadoc)* @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])public void sort(int[] data) {MaxHeap h=new MaxHeap();h.init(data);for(int i=0;i h.remove();System.arraycopy(h.queue,1,data,0,data.length); }private static class MaxHeap{void init(int[] data){this.queue=new int[data.length+1];for(int i=0;i queue[++size]=data;fixUp(size);}}private int size=0;private int[] queue;public int get() {return queue[1];}public void remove() {SortUtil.swap(queue,1,size--);fixDown(1);}//fixdownprivate void fixDown(int k) {int j;while ((j = k << 1) <= size) {if (j < size && queue[j] j++;if (queue[k]>queue[j]) //不用交换break;SortUtil.swap(queue,j,k);k = j;}}private void fixUp(int k) {while (k >1) {int j = k >>1;if (queue[j]>queue[k])break;SortUtil.swap(queue,j,k);k = j;}}}SortUtil:package org.rut.util.algorithm;import org.rut.util.algorithm.support.BubbleSort;import org.rut.util.algorithm.support.HeapSort;import org.rut.util.algorithm.support.ImprovedMergeSort;import org.rut.util.algorithm.support.ImprovedQuickSort;import org.rut.util.algorithm.support.InsertSort;import org.rut.util.algorithm.support.MergeSort;import org.rut.util.algorithm.support.QuickSort;import org.rut.util.algorithm.support.SelectionSort;import org.rut.util.algorithm.support.ShellSort;/*** @author treeroot* @since 2006-2-2* @version 1.0*/public class SortUtil {public final static int INSERT = 1;public final static int BUBBLE = 2;public final static int SELECTION = 3;public final static int SHELL = 4;public final static int QUICK = 5;public final static int IMPROVED_QUICK = 6;public final static int MERGE = 7;public final static int IMPROVED_MERGE = 8;public final static int HEAP = 9;public static void sort(int[] data) {sort(data, IMPROVED_QUICK);}private static String[] name={"insert", "bubble", "selection", "shell", "quick", "improved_quick", "merge", "improved_merge", "heap"};private static Sort[] impl=new Sort[]{new InsertSort(),new BubbleSort(),new SelectionSort(),new ShellSort(),new QuickSort(),new ImprovedQuickSort(),new MergeSort(),new ImprovedMergeSort(),new HeapSort()public static String toString(int algorithm){return name[algorithm-1];}public static void sort(int[] data, int algorithm) { impl[algorithm-1].sort(data);}public static interface Sort {public void sort(int[] data);}public static void swap(int[] data, int i, int j) { int temp = data;data = data[j];data[j] = temp;}}。

java业务的常用算法,应用场景

java业务的常用算法,应用场景

java业务的常用算法,应用场景Java业务的常用算法及应用场景算法是计算机科学的基础,它可以解决各种计算问题。

在Java编程中,算法的应用非常广泛。

本文将介绍Java业务中常用的算法以及它们的应用场景。

一、排序算法排序算法是最基本、最常用的算法之一。

在Java业务中,需要对数据进行排序的场景非常多。

例如,对数组或集合中的元素按照某个属性进行排序,对数据库中的记录按照某个字段进行排序等等。

常用的排序算法有冒泡排序、选择排序、插入排序、快速排序等。

这些算法各有特点,可以根据排序需求的不同选择合适的算法。

二、查找算法查找算法用于在一组数据中查找目标元素。

在Java业务中,查找算法的应用场景也很多。

例如,根据关键字从数据库中查询记录,查找集合中满足条件的元素等等。

常用的查找算法有线性查找、二分查找等。

线性查找适用于无序数据,而二分查找适用于有序数据。

三、图算法图算法用于解决图结构相关的问题。

在Java业务中,图算法可以应用于各种场景。

例如,社交网络中的好友关系图分析,行程规划中的路径搜索等等。

常用的图算法有广度优先搜索、深度优先搜索、最短路径算法等。

这些算法可以帮助我们理解和分析复杂的图结构,解决实际问题。

四、贪心算法贪心算法是一种通过局部最优选择来达到全局最优的算法。

在Java业务中,贪心算法可以用于解决各种优化问题。

例如,资源分配中的任务调度,机票价格计算中的最优组合等等。

贪心算法的核心思想是不断做出局部最优选择,并且希望这些选择最终能够达到全局最优。

虽然贪心算法不一定能够得到最优解,但在许多实际问题中,它的效果是非常好的。

五、动态规划算法动态规划算法是一种将复杂问题分解成简单子问题的思想。

在Java业务中,动态规划算法可以用于解决各种优化问题。

例如,最短路径问题、背包问题、字符串匹配问题等等。

动态规划算法的基本思路是通过保存已计算过的结果,避免重复计算,从而大大提高算法效率。

它常常用于求解具有最优子结构的问题。

Java中List排序的三种实现方法实例

Java中List排序的三种实现方法实例

Java中List排序的三种实现⽅法实例⽬录前⾔1.使⽤ Comparable 排序2.使⽤ Comparator 排序2.1 新建 Comparator ⽐较器2.2 匿名类⽐较器3.使⽤ Stream 流排序总结前⾔在某些特殊的场景下,我们需要在 Java 程序中对 List 集合进⾏排序操作。

⽐如从第三⽅接⼝中获取所有⽤户的列表,但列表默认是以⽤户编号从⼩到⼤进⾏排序的,⽽我们的系统需要按照⽤户的年龄从⼤到⼩进⾏排序,这个时候,我们就需要对 List 集合进⾏⾃定义排序操作了。

L ist 排序的常见⽅法有以下 3 种:1. 使⽤ Comparable 进⾏排序;2. 使⽤ Comparator 进⾏排序;3. 如果是 JDK 8 以上的环境,也可以使⽤ Stream 流进⾏排序。

下⾯我们分别来看各种排序⽅法的具体实现。

1.使⽤ Comparable 排序按照本⽂设计的场景,我们需要创建⼀个包含了⽤户列表的 List 集合,并按⽤户的年龄从⼤到⼩进⾏排序,具体实现代码如下:public class ListSortExample {public static void main(String[] args) {// 创建并初始化 ListList<Person> list = new ArrayList<Person>() {{add(new Person(1, 30, "北京"));add(new Person(2, 20, "西安"));add(new Person(3, 40, "上海"));}};// 使⽤ Comparable ⾃定的规则进⾏排序Collections.sort(list);// 打印 list 集合list.forEach(p -> {System.out.println(p);});}}// 以下 set/get/toString 使⽤的是 lombok 的注解@Getter@Setter@ToStringclass Person implements Comparable<Person> {private int id;private int age;private String name;public Person(int id, int age, String name) {this.id = id;this.age = age; = name;}@Overridepublic int compareTo(Person p) {return p.getAge() - this.getAge();}}以上代码的执⾏结果,如下图所⽰:本⽅法的核⼼代码如下:2.使⽤ Comparator 排序Comparable 是类内部的⽐较⽅法,⽽ Comparator 是排序类外部的⽐较器。

20个java案例

20个java案例

20个java案例以下是20个Java案例,涵盖了不同的主题和功能。

每个案例都有一个简要的描述和示例代码。

1. 计算两个数的和。

描述,编写一个程序,计算两个整数的和并输出结果。

示例代码:java.int num1 = 10;int num2 = 5;int sum = num1 + num2;System.out.println("两个数的和为," + sum);2. 判断一个数是否为偶数。

描述,编写一个程序,判断一个整数是否为偶数,并输出结果。

示例代码:java.int num = 6;if (num % 2 == 0) {。

System.out.println(num + "是偶数。

");} else {。

System.out.println(num + "不是偶数。

");}。

3. 求一个数的阶乘。

描述,编写一个程序,计算一个正整数的阶乘,并输出结果。

示例代码:java.int num = 5;int factorial = 1;for (int i = 1; i <= num; i++) {。

factorial = i;}。

System.out.println(num + "的阶乘为," + factorial);4. 判断一个字符串是否为回文字符串。

描述,编写一个程序,判断一个字符串是否为回文字符串,并输出结果。

示例代码:java.String str = "level";boolean isPalindrome = true;for (int i = 0; i < str.length() / 2; i++) {。

if (str.charAt(i) != str.charAt(str.length() 1 i)) {。

isPalindrome = false;break;}。

计算机软件技巧的实用案例

计算机软件技巧的实用案例

计算机软件技巧的实用案例引言计算机软件技巧在现代社会中扮演着重要的角色,它们可帮助我们更高效地处理各种任务,提高工作和学习效率。

本文将介绍一些实用的计算机软件技巧案例,以帮助读者更好地利用计算机软件进行各种任务。

第一章:办公软件技巧1.1 Microsoft Office中的数据排序数据排序是办公软件中常用的功能之一。

在Microsoft Excel中,我们可以使用“排序”功能对数据进行升序或降序排列。

此外,我们还可以按照多个列的条件排序数据,从而更好地组织和分析数据。

1.2 Adobe Acrobat中的PDF编辑Adobe Acrobat是一款常用的PDF编辑软件。

在编辑PDF文件时,我们可以使用文本编辑工具添加、删除和修改文本内容。

此外,我们还可使用图像编辑工具对PDF文件中的图片进行编辑,例如裁剪、旋转或调整亮度等。

第二章:图形设计软件技巧2.1 Photoshop中的内容感知填充在Photoshop中,内容感知填充工具可帮助我们删除照片中的不需要的对象,保持画面的完整性。

通过选中不需要的对象并使用内容感知填充工具,软件将自动根据周围的图案和颜色填充被删除的区域。

2.2 Illustrator中的形状构建技巧Illustrator是一款广泛用于矢量图形设计的软件。

使用形状构建工具,我们可以创建和编辑各种形状,如圆形、方形和自定义曲线等。

此外,我们还可通过使用描边和填充选项设置形状的颜色和样式。

第三章:编程技巧3.1 Python中的数据分析Python是一种非常流行的编程语言,广泛应用于数据分析领域。

通过使用Python的数据分析库和函数,我们可以对大量数据进行处理和分析,如数据清洗、统计分析、绘制数据可视化图表等。

3.2 Java中的多线程编程Java是一种重要的编程语言,具有强大的多线程支持。

通过使用Java的多线程技术,我们可以同时执行多个任务,提高程序的性能和响应速度。

同时,还需要注意多线程编程中的同步和竞争条件问题,确保线程安全性。

jpasort.sort()用法

jpasort.sort()用法

《深入探究jpasort.sort()用法》一、jpasort.sort()的基本概念在Java编程中,jpasort.sort()是一个用于对集合进行排序的方法。

它可以帮助程序员对数据库中的数据进行排序,使得数据在查询的时候以指定的顺序呈现出来。

在实际应用中,对数据进行排序是非常常见且重要的操作,因此掌握jpasort.sort()的用法对于Java开发人员来说是至关重要的。

二、jpasort.sort()的使用方法1. jpasort.sort()的基本语法在使用jpasort.sort()方法进行排序时,首先需要创建一个Sort对象,并且在其构造函数中指定排序的字段和排序的方式。

具体的语法格式如下:Sort sort = Sort.by(Sort.Direction.ASC, "字段名");在这里,Sort.Direction.ASC表示升序排序,"字段名"代表要排序的字段名。

通过这种方式,就可以创建一个用于排序的Sort对象。

2. jpasort.sort()的实际应用假设我们有一个名为Student的实体类,其中包含了id、name和age等字段。

如果我们想要按照学生的芳龄进行升序排序,那么可以这样使用jpasort.sort()方法:Sort sort = Sort.by(Sort.Direction.ASC, "age");通过这样的操作,就可以实现对Student实体类中的芳龄字段进行升序排序。

三、jpasort.sort()的深入理解1. jpasort.sort()方法的内部实现原理jpasort.sort()方法的内部实现原理是通过构建一个排序对象,然后利用该对象来对数据进行排序。

在实际应用中,排序的字段和排序的方式都是可以动态指定的,因此可以实现灵活的排序操作。

通过深入理解jpasort.sort()方法的内部实现原理,可以帮助我们更加灵活地应用这个方法。

collection的sort方法

collection的sort方法

collection的sort方法Collection类是Java集合框架中的一个顶级接口,它提供了对集合对象进行排序的sort方法。

sort方法可以根据元素的自然顺序或者自定义的比较器对集合进行排序。

本文将详细介绍Collection的sort方法的使用及其注意事项。

一、sort方法的基本用法sort方法是Collection接口的默认方法,它可以对实现了Collection接口的类进行排序。

sort方法有两个重载的版本:1. sort():根据集合元素的自然顺序进行排序,要求集合元素实现Comparable接口。

2. sort(Comparator<? super E> c):根据指定的比较器对集合元素进行排序。

下面通过示例代码演示sort方法的基本用法:```javaList<String> list = new ArrayList<>();list.add("apple");list.add("banana");list.add("orange");// 使用自然顺序进行排序Collections.sort(list);System.out.println(list); // 输出:[apple, banana, orange]// 使用自定义的比较器进行排序Collections.sort(list, (s1, s2) -> pareTo(s1)); System.out.println(list); // 输出:[orange, banana, apple]```在示例代码中,我们首先创建了一个ArrayList集合,并添加了三个水果。

然后,我们使用Collections.sort方法对集合进行排序,第一次使用的是默认的自然顺序,第二次使用的是自定义的比较器。

最后,我们分别输出排序后的结果。

java中ArrayList的两种排序方法实例

java中ArrayList的两种排序方法实例

java中ArrayList的两种排序⽅法实例⽬录前⾔1.ArrayList使⽤排序的初衷2.对⼀个ArrayList中的数组进⾏排序。

3.多个ArrayList中的元素进⾏排序总结前⾔由于其功能性和灵活性,ArrayList是 Java 集合框架中使⽤最为普遍的集合类之⼀。

ArrayList 是⼀种 List 实现,它的内部⽤⼀个动态数组来存储元素,因此 ArrayList 能够在添加和移除元素的时候进⾏动态的扩展和缩减。

你可能已经使⽤过 ArrayList,因此我将略过基础部分。

如果你对 ArrayList 还不熟悉,你可以参考它的,可以很容易理解在 ArrayList 上执⾏基本的操作。

1.ArrayList使⽤排序的初衷我们知道ArrayList的好处是可以不⽤限定容器的⼤⼩,他会根据元素的增加⾃⼰扩⼤。

但是存储进去的数据类型都会变成object,虽然每个元素有⾃⼰的index,但不像数组的下标可以更加⽅便的操作。

那我们平时学习的选择排序啊快速排序啊都是对数组进⾏操作。

最开始的笨办法就是把list中的数据传给数组排序好了再传回来喽。

但是这样效率真的下降的不是⼏倍,是⼏⼗倍啊真的不能这样来。

查了点资料和案例在这⾥总结⼀下。

2.对⼀个ArrayList中的数组进⾏排序。

⾸先来看下Collection的帮助⽂档:在这⾥顺便补充下ArrayList和Collection的关系:具体的使⽤代码如下:import java.util.ArrayList;import java.util.Collections;import java.util.Scanner;public class compre {public static void main(String[] args) {// TODO Auto-generated method stubScanner scan=new Scanner(System.in);int n;ArrayList al=new ArrayList();System.out.println("请输⼊需要的个数");n=scan.nextInt();System.out.println("请逐⼀输⼊");for(int i=0;i<n;i++) {al.add(i,scan.nextInt());}System.out.println("你输⼊的数字是:");for(int i=0;i<al.size();i++) {int temp=(int)al.get(i);System.out.print(temp+" ");}Collections.sort(al);//针对⼀个ArrayList内部的数据排序System.out.println();System.out.println("经过排序后:");for(int i=0;i<al.size();i++) {int temp=(int)al.get(i);System.out.print(temp+" ");}}}运⾏结果:3.多个ArrayList中的元素进⾏排序class SortByName implements Comparator {public int compare(Object o1, Object o2) {Student s1 = (Student) o1;Student s2 = (Student) o2;return s1.getName().compareTo(s2.getName());}}class SortByAge implements Comparator {public int compare(Object o1, Object o2) {Student s1 = (Student) o1;Student s2 = (Student) o2;return s1.getAge().compareTo(s2.getAge());// if (s1.getAge() > s2.getAge())// return 1;// return -1;}}总结到此这篇关于java中ArrayList两种排序的⽂章就介绍到这了,更多相关java ArrayList排序⽅法内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。

java学习案例-斗地主洗牌发牌

java学习案例-斗地主洗牌发牌

斗地主洗牌发牌【案例介绍】1.任务描述扑克牌游戏“斗地主”,相信许多人都会玩,本案例要求编写一个斗地主的洗牌发牌程序,要求按照斗地主的规则完成洗牌发牌的过程。

一副扑克总共有54张牌,牌面由花色和数字组成(包括J、Q、K、A字母)组成,花色有♠、♥、♦、♣ 四种,分别表示黑桃、红桃、方块、梅花,小☺、大☻分别表示小王和大王。

斗地主游戏共有3位玩家参与,首先将这54张牌的顺序打乱每人轮流摸一次牌,剩余3张留作底牌,然后在控制台打印3位玩家的牌和3张底牌。

2.运行结果任务运行结果如图6-1所示:图6-1 运行结果图【任务介绍】●学会分析“斗地主之洗牌发牌”任务的实现思路。

●根据思路独立完成“斗地主之洗牌发牌”任务的源代码编写、编译及运行。

●掌握List集合和Map集合特点及常用方法的使用。

●掌握集合遍历的方式。

【实现思路】(1)要实现纸牌程序,首先需要完成纸牌的组装。

牌面是由花色(包括♠、♥、♦、♣花色)和数字(包括J、Q、K、A字母)两部分组成,可以创建两个ArrayList集合作为花色集合与数字集合,存储时需要注意。

比10大的牌的数字用J、Q、K表示,1用A表示。

(2)将花色集合与数字集合这两个循环进行嵌套循环,将花色与数字组合,形成52章牌,并赋予其编号。

将组合后的牌存放到一个HashMap集合中,集合的Key值是编号,value值是组装完成的纸牌。

还有两张牌是大小王(小☺表示小王、大☻表示大王)。

由于组装规则不一致,需单独使用add()方法将这两张牌加入到HashMap集合中。

(3)创建一个数字集合,用这个数字集合代替纸牌完成洗牌和发牌操作。

由于纸牌的数量是54张,所以创建集合范围是0~53。

(4)可以使用Collection类的shuffle()方法完成打乱数字集合的操作,实现洗牌效果。

由于只有3个人,所以可以使用for循环,通过将数字与3取余的方法,将代表不同纸牌的数字分配给不同人与底牌,实现发牌效果。

java中让数组从大到小排序的方法

java中让数组从大到小排序的方法

java中让数组从大到小排序的方法下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。

文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!Java中让数组从大到小排序的方法在Java中,对数组进行排序是非常常见的操作。

java list 树形数据排序方法

java list 树形数据排序方法

java list 树形数据排序方法Java中的List是一种常见的数据结构,它可以存储多个元素,并且可以动态地调整大小。

在实际的开发中,我们经常会遇到需要对树形数据进行排序的需求。

本文将介绍一些常用的方法和技巧,帮助我们对Java List中的树形数据进行排序。

一、树形数据结构简介树形数据结构是一种层次化的数据结构,它由节点和边组成。

每个节点可以有多个子节点,但只能有一个父节点,树形数据结构中的节点之间存在一种层次关系。

常见的树形数据结构有二叉树、多叉树和平衡树等。

二、List中树形数据的排序方法1. 自定义比较器在Java中,我们可以使用自定义比较器来对List中的树形数据进行排序。

比较器是一个实现了Comparator接口的类,它定义了比较两个对象的规则。

我们可以根据树形数据的特点,编写自定义比较器来实现排序。

例如,假设我们有一个树形数据的类TreeNode,它有一个属性value表示节点的值,还有一个属性children表示子节点列表。

我们可以编写一个自定义比较器TreeComparator来比较两个TreeNode对象的大小。

```javapublic class TreeComparator implements Comparator<TreeNode> {@Overridepublic int compare(TreeNode node1, TreeNode node2) {// 比较两个节点的值return node1.getValue().compareTo(node2.getValue());}}```然后,我们可以使用Collections.sort方法来对List中的树形数据进行排序。

```javaList<TreeNode> treeList = new ArrayList<>();// 添加树形数据到List中// ...// 使用自定义比较器进行排序Collections.sort(treeList, new TreeComparator());```2. 递归排序如果树形数据的结构比较复杂,或者我们需要按照多个属性进行排序,可以使用递归排序的方法。

java简单项目案例附讲解

java简单项目案例附讲解

java简单项目案例附讲解一、学生成绩管理系统项目简介:开发一个学生成绩管理系统,能够实现学生信息的录入、查询、修改和删除等功能,并能根据学生成绩进行排序和统计分析。

1. 学生信息录入:通过界面输入学生的基本信息包括学号、姓名、性别、年龄等,并能够录入学生的各科成绩。

2. 学生信息查询:提供学生信息的查询功能,可以按学号或姓名进行查询,查询结果展示学生的基本信息和各科成绩。

3. 学生信息修改:允许对学生的基本信息和成绩进行修改,包括姓名、性别、年龄、各科成绩等。

4. 学生信息删除:提供删除学生信息的功能,可以根据学号或姓名进行删除操作。

5. 学生成绩排序:能够按照总分或某一科目的成绩对学生进行排序,可以选择升序或降序排列。

6. 学生成绩统计:能够对学生的各科成绩进行统计分析,包括平均分、最高分、最低分等。

7. 数据存储:使用数据库或文件存储学生的信息和成绩数据,保证数据的可靠性和安全性。

二、图书管理系统项目简介:开发一个图书管理系统,能够实现图书的录入、借阅、归还和查询等功能,能够对借阅情况进行管理和统计。

1. 图书录入:通过界面输入图书的基本信息包括书名、作者、出版社、出版日期等,并生成唯一的图书编号。

2. 图书借阅:提供图书借阅功能,学生或教师可以通过输入图书编号进行借阅操作,并记录借阅人和借阅日期。

3. 图书归还:提供图书归还功能,借阅人可以通过输入图书编号进行归还操作,并记录归还日期。

4. 图书信息查询:能够根据图书编号或关键字进行图书信息的查询,查询结果展示图书的基本信息和借阅情况。

5. 借阅情况管理:能够对图书的借阅情况进行管理,包括借阅人、借阅日期、归还日期等。

6. 图书统计分析:能够对图书的借阅情况进行统计分析,包括借阅次数、借阅人数等。

7. 数据存储:使用数据库或文件存储图书的信息和借阅情况,保证数据的可靠性和安全性。

三、在线购物系统项目简介:开发一个在线购物系统,能够实现用户的注册、登录、商品浏览、购买和订单管理等功能,提供安全、便捷的购物体验。

java中List对象列表实现去重或取出及排序的方法

java中List对象列表实现去重或取出及排序的方法

java中List对象列表实现去重或取出及排序的⽅法前⾔因为在⾯试的时候碰到⼏次list的去重和排序,觉着有必要给⼤家总结⼀下具体的⽅法,分享出来供⼤家学习参考,话不多说了,来⼀起看看下⾯介绍的⼀种做法:⼀、list去重1.1 实体类StudentList<Student>容量10k以上,要求去重复。

这⾥Student的重复标准是属性相同,因此需要重写equals和hashcode⽅法,不知道有⼏个可以⼿写出来。

student的equals⽅法:public void equals(Object o){if(this == o) retun true;if(!(o instanceof Student)) return false;Student stu = (Studend)o;if(id!=stu.id) return false;if(age!=stu.age) return false;return name!=null ? name.equals() : ==null;}这⾥只要记住宗旨是⽐较Student的属性即可,如果属性相同则相等。

先考虑地址相等,然后类型匹配instanceof。

接下来是各种属性,int属性直接双等号⽐较,String类型需要判断是否为null,如果是null则都是null返回true,如果不是null则⽐较equals。

student的hashcode⽅法:public int hashCode(){int result = id;reuslt = 31*id +(name!=null?name.hashCode():0);reuslt = 31*age;return reuslt;}hashCode是为了hash表计算做辅助,⽅便快速查找。

因此hash算法的结果要尽量的散列。

这⾥⽤到31,这个31在别的博客中看到的原因是这样的: obj*31==obj<<5-obj.左移5位相当乘以2的5次⽅,就是32.null的hashCode为空。

JAVA冒泡排序从小到大和从大到小详细过程

JAVA冒泡排序从小到大和从大到小详细过程
完整代码及运行结果: package sort;
public classபைடு நூலகம்bubleSort {
public static void main(String args[]) {
int a[]={6,4,5,7,3};
System.out.println("排序前的数组为:"); for(int i=0;i<a.length;i++)//打印排序前的数组 {
if(a[j]>a[j+1])//如果前一位大于后一位,则交换,大的数排在后面 {
int temp=a[j+1]; a[j+1]=a[j]; a[j]=temp; } } } for(int i=0;i<a.length;i++)//打印从小到大冒泡排序后的数组 { System.out.print("a["+i+"]="+a[i]+" "); } System.out.println(); System.out.println("从大到小冒泡排序后的数组为:"); for(int i=0;i<a.length-1;i++) { for(int j=0;j<a.length-1-i;j++) { if(a[j]<a[j+1])//如果前一位小于后一位,则交换,大的数排在前面 { int temp=a[j+1]; a[j+1]=a[j]; a[j]=temp; } } } for(int i=0;i<a.length;i++)//打印从大到小冒泡排序后的数组 { System.out.print("a["+i+"]="+a[i]+" "); } } } 运行结果:

任意1-10中的4个数字,使用加减乘除计算得出24结果的可能组合(java版),很多人小时候都玩过

任意1-10中的4个数字,使用加减乘除计算得出24结果的可能组合(java版),很多人小时候都玩过

任意1-10中的4个数字,使⽤加减乘除计算得出24结果的可能组合(java版),很多⼈⼩时候都玩过⽬录1. 需求;2. 需求该如何分析呢,怎么划分成⼩需求呢?3. 如何把⼩需求编排成完整需求;学有所得1. 学会分析需求,由哪些组成(规则,逻辑等);2. 能把的需求分解成很多⼦需求、或孙需求、或童孙需求,直到每个需求很清晰可实施地为⽌3. 学会把各种⼦孙需求,通过组合编排,最终成为⼀个完整的⼤需求解决⽅案需求需求:任意1-10中的4个数字,使⽤加减乘除计算得出24结果的可能组合;通过初步分析,我们可以得到如下规则:规则:1、任意1-10中的4个数字;2、使⽤加减乘除计算得出24;3、在任何⼀次计算中不能出现⼩数,⽐如:(4.0 + 8.0) / (3.0 / 6.0) = 24.0,这种是不算的,虽然最终结果是24,因为3/6=0.5;(8.0 / 3.0) * (4.0 + 5.0) = 24.0,虽然最终为24,但是在第⼀步结果却是⼩数,所以不成⽴;代码如下/*** 是否为合法的计算结果* @param result* @return*/public static boolean isValidResult(double result){if (result<1){return false;}return result == Math.floor(result);}View Code4、整个运算中应该使⽤double类型,因为整数相除,使⽤int类型,在计算机中,会把余数抹掉,直接取整,这样就会造成结果不正确;那需求该如何分析呢,怎么划分成⼩需求呢?⼀般来说我们都会通过案例来分析,⽐如:这个需求,我们使⽤传统的计算,假设我们已经有这四个数[3,4,8,6],可能会有如下组合:⽅案:((4.0 + 8.0) * 6.0) / 3.0=24.0;⽅案:((3.0 * 4.0) - 8.0) * 6.0=24.0;⽅案:((8.0 - 6.0) * 3.0) * 4.0=24.0;⽅案:((4.0 + 8.0) / 3.0) * 6.0=24.0;⽅案:(4.0 * 3.0) * (8.0 - 6.0) = 24.0;⽅案:(6.0 / 3.0) * (4.0 + 8.0) = 24.0;我们暂时先分析这个⼏个⽅案,⼤家看到这⾥,可以先思考⼀下有什么规律,有什么规则;....................................................................................................Thinking..............................从这些⽅案中,我们可以得出如下蹊跷之处:1、所有的⽅案中,都在这四个数的所有可能排列组合中(我记忆之中,应该是⾼中数学的知识点);2、我们可以把计算法则归纳为两种,所有的都可以归纳到⼀下两种中去;第⼀、从左到右的依次计算;第⼆、两两组合,前两个数计算结果和后两个数的计算结果再次计算;第三、每个⽅案都有3个运算符;不知道⼤家是不是和我发现的⼀样不,或者说有更多的发现;我认为不管什么发现都可以先列出来,然后在逐个去去除⼀些太离谱的发现;我们再继续顺藤摸⽠,到此我们可以把需求分解如下:我们继续分析需求,看看是否可以再次分解从上⾯的需求中我们可以进⼀步进⾏分解第⼀、如何获取四个数的所有排列组合?1、举例,我们继续使⽤案列来分析,⽐如 [3,4,8,6][3,4,8,6](基准)[4,3,8,6](第⼆和第⼀调换)[3,8,4,6] [8,3,4,6](第三和第⼆调换,第⼆和第⼀调换)[3,4,6,8] [3,6,4,8] [6,3,4,8] (第四和第三调换,第三和第⼆调换,第⼆和第⼀调换)这样是不是所有的排列组合呢?显然不是?因为还有三种基准进⾏上⾯的排列组合,也就是上⾯每⾏最后⼀列[4,3,8,6](基准2)[8,3,4,6](基准3)[6,3,4,8](基准4)2、通过上⾯的举例,我们就可以先获取所有的基准组合;3、通过上⾯,我们可以知道每种基准的所有组合;4、通过上⾯的⽅法获取的组合会有重复,需要前需要去重;这样我们就能获取4个数的所有排列组合;我感觉这种获取所有排列组合的算法很笨重(有没有感觉有点想冒泡排序),不优雅,肯定有更优的⽅案,只是我不知道⽽已,如果知道的可以留⾔,谢谢;所有排列分析到此,是不是还需要继续分析,可以继续思考;本⼈感觉可以落地了;如果觉得需要继续分析的,可以继续分解,知道⾃⼰很清晰,知道怎么⼲为⽌(这个因⼈⽽异);请看代码;获取所有基准代码:double[] array = {3, 4, 6, 8};List<double[]> resultAllList = new ArrayList<>();List<double[]> list = new ArrayList<>();list.add(array);list.add(new double[]{array[1], array[2], array[3], array[0]});list.add(new double[]{array[2], array[3], array[0], array[1]});list.add(new double[]{array[3], array[0], array[1], array[2]});View Code获取每个基准的所有排列组合:/*** 获取array的所有可能组合** @param list* @param array*/public static void getAllArray(List<double[]> list, double[] array) {if (!exists(list, array)) {list.add(array);}for (int i = 1; i < 4; i++) {double[] arrayCopy = Arrays.copyOf(array, array.length);List<double[]> newList = getArrayList(arrayCopy, i);Iterator<double[]> iterator = newList.iterator();while (iterator.hasNext()) {double[] temp = iterator.next();if (!exists(list, temp)) {list.add(temp);}}}}/*** 获取array下标遇到i的位置左右组合** @param array* @param i* @return*/public static List<double[]> getArrayList(double[] array, int i) {List<double[]> list = new ArrayList<>();for (int j = i; j > 0; j--) {double temp = array[j];array[j] = array[j - 1];array[j - 1] = temp;list.add(array);array = Arrays.copyOf(array, array.length);}return list;}View Code第⼆,对于算法法则该如何继续分析呢?我们可以继续使⽤举例从上⾯随意获取⼀种排列组合,⽐如:[3,4,8,6]1、从左到右的组合,在上⾯四个数字中,任意两个数中,我们可以有+,- ,*,/这四种算法,这⼜是⼀种计算的所有排列组合,并把结果和24对⽐,如果相等,那就是可⾏⽅案;那我们是不是继续使⽤上⾯获取组合的⽅式呢?显然不是,这⾥关键点在于:任意两个数中都有+-*/的算法,这⾥我们可以使⽤三个for循环解决;举例:((3.0 * 4.0) - 8.0) * 6.0=24.0;/*** 计算array能算24点的所有组合,从左到右的顺序** @param* @throws Exception*/public static int caculate24Point(double[] array) throws Exception {int count = 0;if (array.length != 4) {throw new Exception("不是四个数");}for (String op : operators) {String expressionStr = "";double result = getTwoNumCaculate(array[0], array[1], op);if (!isValidResult(result)){continue;}expressionStr = String.format("(%s %s %s)", array[0], op, array[1]);for (String op2 : operators) {double result1 = getTwoNumCaculate(result, array[2], op2);if (!isValidResult(result1)){continue;}String expressionStr2 = String.format("(%s %s %s)", expressionStr, op2, array[2]);for (String op3 : operators) {double result2 = getTwoNumCaculate(result1, array[3], op3);String expressionStr3 = String.format("%s %s %s", expressionStr2, op3, array[3]);if (result2 == 24.0d) {count++;System.out.println(String.format("⽅案:%s=%s", expressionStr3, result2));}}}}return count;}View Code2、两两组合,思路和上⾯有些相似,前两个数的任意计算结果1,后两个数的任意计算结果2,结果1和结果2的任意计算结果3,结果3和24对⽐,如果相等,那就是可⾏⽅案;举例:(3.0 * 4.0) * (8.0 - 6.0) = 24.0;/*** 计算array能算24点的所有组合 ,两两组合** @param array* @return* @throws Exception*/public static int caculate24Point2(double[] array) throws Exception {int count = 0;if (array.length != 4) {throw new Exception("不是四个数");}for (String op : operators) {double result1 = getTwoNumCaculate(array[0], array[1], op);if (!isValidResult(result1)){continue;}String expressionStr1 = String.format("(%s %s %s)", array[0], op, array[1]);for (String op2 : operators) {double result2 = getTwoNumCaculate(array[2], array[3], op2);if (!isValidResult(result2)){continue;}String expressionStr2 = String.format("(%s %s %s)", array[2], op2, array[3]);for (String op3 : operators) {double result3 = getTwoNumCaculate(result1, result2, op3);String expressionStr3 = String.format("%s %s %s", expressionStr1, op3, expressionStr2);if (result3 == 24.0d) {count++;System.out.println(String.format("⽅案: %s = %s", expressionStr3, result3));}}}}return count;}View Code某⼀种四个数的所有运算排列通过上⾯的⽅式我们可以全部获取,分析到此,我觉得代码可以落地,当然,如果你觉得还不够清晰,可以继续分析,直到⾃⼰清晰为⽌,这⾥我只是提供分解需求的思路⽽已;在软件⼯程中,我们必定先分析需求,然后分解需求,我们有四⾊分析⽅式,我们还有DDD领域的分析⽅式等,都是需要通过逐步分解成更⼩的需求来反复验证的;到⽬前为⽌我们可以得出如下思维导图把各种⼦孙需求,通过组合编排,最终成为⼀个完整的⼤需求解决⽅案最后,我们把每个⼩的需求加上⼀些规则逻辑组合成完整的⼤需求,我们暂时叫做编排吧;这⾥其实也是⼀个难点,很多⼈希望⼀次性把代码写完整,写正确,其实这种思路是不正确的,这样只会增加代码的难度,⼀次性能把代码写的有多完整多正确,这个跟每个⼈的编程经验熟练度有关;不管编程多⽜,从⽆到有的敲代码⽅向不是⼀次性把左右的代码完成,重点⽅向把核⼼逻辑思路编写上,其次才逐步把⼀些细节逻辑规则加上去,这个就和我们⼩时候学画画⼀样,画⼀颗树先画主⼲然后画叶⼦最后添加果⼦和花之类的;到⽬前为⽌是否完整呢?其实还差⼀点,任意的1-10的数字从哪⾥获取,不过需求没有明确,可以是⽤户输⼊,数据库获取,其他接⼝的传⼊,我们这⾥就定位⽤户输⼊吧获取⽤户输⼊代码如下:double[] array = new double[4];int index=0;Scanner scanner=new Scanner(System.in);while (index<4){System.out.println(String.format("请输⼊第%s个1-10的整数",index+1));String tempNumStr=scanner.nextLine();if(!StringUtils.isNumeric(tempNumStr)){System.out.println("你输⼊的不是⼀个整数");continue;}double tmpNum=Double.valueOf(tempNumStr);if (tmpNum<0 || tmpNum>10){System.out.println("你输⼊的数字不是1-10的数字");continue;}array[index++]=tmpNum;}System.out.println(String.format("你输⼊的4个1-10的整数为%s,%s,%s,%s",array[0],array[1],array[2],array[3]));View Code最终完整代码如下:import ng3.StringUtils;import java.util.*;/*** Author:* Date:*/public class Point24Caculator {/*** 计算24点中可以到的操作*/private static String[] operators = {"+", "-", "*", "/"};public static void main(String[] args) throws Exception {double[] array = new double[4];int index=0;Scanner scanner=new Scanner(System.in);while (index<4){System.out.println(String.format("请输⼊第%s个1-10的整数",index+1));String tempNumStr=scanner.nextLine();if(!StringUtils.isNumeric(tempNumStr)){System.out.println("你输⼊的不是⼀个整数");continue;}double tmpNum=Double.valueOf(tempNumStr);if (tmpNum<0 || tmpNum>10){System.out.println("你输⼊的数字不是1-10的数字");continue;}array[index++]=tmpNum;}System.out.println(String.format("你输⼊的4个1-10的整数为%s,%s,%s,%s",array[0],array[1],array[2],array[3]));System.out.println("结果如下:");List<double[]> resultAllList = new ArrayList<>();List<double[]> list = new ArrayList<>();list.add(array);list.add(new double[]{array[1], array[2], array[3], array[0]});list.add(new double[]{array[2], array[3], array[0], array[1]});list.add(new double[]{array[3], array[0], array[1], array[2]});for (int i = 0; i < list.size(); i++) {getAllArray(resultAllList, Arrays.copyOf(list.get(i), list.get(i).length));}int sum = 0;Iterator<double[]> iterator = resultAllList.iterator();while (iterator.hasNext()) {double[] tempArray = iterator.next();sum += caculate24Point(tempArray);sum += caculate24Point2(tempArray);}System.out.println("总共⽅案数量:" + sum);}/*** 获取array的所有可能组合** @param list* @param array*/public static void getAllArray(List<double[]> list, double[] array) {if (!exists(list, array)) {list.add(array);}for (int i = 1; i < 4; i++) {double[] arrayCopy = Arrays.copyOf(array, array.length);List<double[]> newList = getArrayList(arrayCopy, i);Iterator<double[]> iterator = newList.iterator();while (iterator.hasNext()) {double[] temp = iterator.next();if (!exists(list, temp)) {list.add(temp);}}}}/*** 获取array下标遇到i的位置左右组合** @param array* @param i* @return*/public static List<double[]> getArrayList(double[] array, int i) {List<double[]> list = new ArrayList<>();for (int j = i; j > 0; j--) {double temp = array[j];array[j] = array[j - 1];array[j - 1] = temp;list.add(array);array = Arrays.copyOf(array, array.length);}return list;}/*** array是否存啊在list中** @param list* @param array* @return*/public static boolean exists(List<double[]> list, double[] array) {Iterator<double[]> iterator = list.iterator();while (iterator.hasNext()) {double[] tmpArray = iterator.next();if (tmpArray[0] == array[0] && tmpArray[1] == array[1] && tmpArray[2] == array[2] && tmpArray[3] == array[3]) { return true;}}return false;}/*** 计算array能算24点的所有组合,从左到右的顺序** @param* @throws Exception*/public static int caculate24Point(double[] array) throws Exception {int count = 0;if (array.length != 4) {throw new Exception("不是四个数");}for (String op : operators) {String expressionStr = "";double result = getTwoNumCaculate(array[0], array[1], op);if (!isValidResult(result)){continue;}expressionStr = String.format("(%s %s %s)", array[0], op, array[1]);for (String op2 : operators) {double result1 = getTwoNumCaculate(result, array[2], op2);if (!isValidResult(result1)){continue;}String expressionStr2 = String.format("(%s %s %s)", expressionStr, op2, array[2]);for (String op3 : operators) {double result2 = getTwoNumCaculate(result1, array[3], op3);String expressionStr3 = String.format("%s %s %s", expressionStr2, op3, array[3]);if (result2 == 24.0d) {count++;System.out.println(String.format("⽅案:%s=%s", expressionStr3, result2));}}}}return count;}/*** 计算array能算24点的所有组合 ,两两组合** @param array* @return* @throws Exception*/public static int caculate24Point2(double[] array) throws Exception {int count = 0;if (array.length != 4) {throw new Exception("不是四个数");}for (String op : operators) {double result1 = getTwoNumCaculate(array[0], array[1], op);if (!isValidResult(result1)){continue;}String expressionStr1 = String.format("(%s %s %s)", array[0], op, array[1]);for (String op2 : operators) {double result2 = getTwoNumCaculate(array[2], array[3], op2);if (!isValidResult(result2)){continue;}String expressionStr2 = String.format("(%s %s %s)", array[2], op2, array[3]);for (String op3 : operators) {double result3 = getTwoNumCaculate(result1, result2, op3);String expressionStr3 = String.format("%s %s %s", expressionStr1, op3, expressionStr2);if (result3 == 24.0d) {count++;System.out.println(String.format("⽅案: %s = %s", expressionStr3, result3));}}}}return count;}/*** 是否为合法的计算结果* @param result* @return*/public static boolean isValidResult(double result){if (result<1){return false;}return result == Math.floor(result);}private static double getTwoNumCaculate(double num1, double num2, String operator) throws Exception { switch (operator) {case "+":return num1 + num2;case "-":return num1 - num2;case "*":return num1 * num2;case "/":return num1 / num2;default:throw new Exception("运算符不符合规范");}}}View Code学有所得1. 是否学会了这种分析思路2. 是否这种需求分析思路可以运⽤在地⽅?3. 这种把每个原⼦需求编排成⼀个完整⼤需求,是否可以在他地⽅使⽤?最后效果图:。

java bigdecimal 排序加判空

java bigdecimal 排序加判空

标题:Java中使用BigDecimal进行排序和判空操作的实践摘要:本文将探讨在Java中使用BigDecimal进行排序和判空操作的相关实践,包括BigDecimal的基本介绍、排序方法和判空方法,并结合实际案例进行详细讲解。

1. 概述在Java开发中,处理数值计算和排序是非常常见的需求。

而对于涉及金融、科学计算等领域来说,精度和BigDecimal的处理则显得尤为重要。

本文将介绍如何使用BigDecimal进行排序和判空操作的实践方法,旨在帮助读者掌握这一重要的开发技能。

2. BigDecimal简介BigDecimal是Java中表示任意精度的浮点数的类,通常用于需要较高精度的金融和科学计算。

与传统的浮点数类型(如double和float)不同,BigDecimal能够精确表示小数,并能够避免浮点数计算中的精度丢失问题。

3. 使用BigDecimal进行排序在实际开发中,我们经常需要对一组数字进行排序操作。

而对于需要进行高精度计算的数值,就需要使用BigDecimal来进行排序。

下面是一种基于BigDecimal的排序方法:```javaList<BigDecimal> list = new ArrayList<>();// 添加数据到list中Collections.sort(list);```以上代码通过创建一个BigDecimal类型的列表,然后使用Collections.sort()方法进行排序。

这样就可以确保小数精度不会丢失,并且可以按照预期的方式进行排序。

4. 判空操作在处理数据时,经常需要进行判空操作以确保数据的完整性和准确性。

而对于BigDecimal类型的数据来说,也需要特别注意其判空操作。

一种常见的做法是利用BigDecimalpareTo()方法进行判空,示例代码如下:```javaBigDecimal value = ...; // 获取数据if(value != null valuepareTo(BigDecimal.ZERO) != 0) {// 执行操作}```在上面的代码中,首先判断数值不为null,然后再判断其与BigDecimal.ZERO的比较结果是否为0,如果不为0则执行相应操作。

JAVA8新特性之List的各种用法(最大、最小、平均值、分组、求和、遍历、过滤、排序)

JAVA8新特性之List的各种用法(最大、最小、平均值、分组、求和、遍历、过滤、排序)

JAVA8新特性之List的各种⽤法(最⼤、最⼩、平均值、分组、求和、遍历、过滤、排序)构建⼀个User实体类供演⽰public class Users {/*** ID*/private Long id;/*** ⽤户名*/private String name;/*** 年龄*/private int age;/*** ⼯号*/private String jobNumber;/*** 性别*/private String sex;/*** 注册时间*/private Date entryDate;/*** 成员组织*/private BigDecimal familyMemberQuantity;private Long userId;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) { = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getJobNumber() {return jobNumber;}public void setJobNumber(String jobNumber) {this.jobNumber = jobNumber;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public Date getEntryDate() {return entryDate;}public void setEntryDate(Date entryDate) {this.entryDate = entryDate;}public BigDecimal getFamilyMemberQuantity() {return familyMemberQuantity;}public void setFamilyMemberQuantity(BigDecimal familyMemberQuantity) {this.familyMemberQuantity = familyMemberQuantity;}public Long getUserId() {return userId;}public void setUserId(Long userId) {erId = userId;}@Overridepublic String toString() {return "Users{" +"id=" + id +", name='" + name + '\'' +", age=" + age +", jobNumber='" + jobNumber + '\'' +", sex='" + sex + '\'' +", entryDate=" + DateFormatUtils.format(entryDate, "yyyy-MM-dd HH:mm:ss") +", familyMemberQuantity=" + familyMemberQuantity +'}';}}⼀、根据字段分组得到多个List集合构建⼀个产⽣Users的静态法/*** ⽣产虚拟⽤户** @return*/public static List<Users> produceUser() {List<Users> usersList = new ArrayList<>();for (int i = 1; i <= 10; i++) {Users users = new Users();users.setId(Long.valueOf(i));users.setName("kobe" + i);users.setAge(15 + new Random().nextInt(5));users.setJobNumber("jobNumber" + i);if (i % 2 == 0) {users.setSex("男");} else {users.setSex("⼥");}users.setEntryDate(new Date());users.setFamilyMemberQuantity(new BigDecimal(i));usersList.add(users);}return usersList;}利⽤Java8 特性,根据对象的某个属性进⾏分组@Testpublic void groupByGender() {List<Users> list = produceUser();// 根据性别进⾏分组Map<String, List<Users>> collect = list.stream().collect(Collectors.groupingBy(Users::getSex)); Set<Map.Entry<String, List<Users>>> entries = collect.entrySet();entries.forEach(item -> {// 性别男 / ⼥String gender = item.getKey();// 男集合 / ⼥集合List<Users> usersList = item.getValue();System.out.println(gender);usersList.forEach(user -> System.out.println(user));});}输出结果如下⼆、集合求和2.1 根据对象中的某个字段求和/*** 根据年龄字段求总和*/@Testpublic void getSumByStream() {List<Users> list = produceUser();int sum = list.stream().mapToInt(Users::getAge).sum();System.out.println("共计:" + list.size() + "个⽤户,所有年龄总和为:" + sum);// 求最⼤年龄Integer integer = list.stream().map(Users::getAge).max(Integer::compareTo).get();System.out.println(integer);// 得到最⼤年龄对象Users users = list.stream().max(paringInt(Users::getAge)).get();System.out.println(users);// 求平均年龄System.out.println(list.stream().mapToInt(Users::getAge).average().getAsDouble());// 求最⼤年龄System.out.println(list.stream().mapToInt(Users::getAge).max().getAsInt());}输出结果如下2.2 List<数值型> 求和/*** 根据List求和*/@Testpublic void getListSumByJava8() {List<Integer> listInt = new ArrayList();List<Double> listDoub = new ArrayList();for (int i = 0; i < 500; i++) {listInt.add(new Random().nextInt(1000));listDoub.add(new Random().nextDouble());}System.out.println("=======数值型Integer求和======");Integer integer = listInt.stream().reduce(Integer::sum).orElse(0);System.out.println(integer);System.out.println("=======数值型Double求和======");Double integer1 = listDoub.stream().reduce(Double::sum).orElse(0.00);System.out.println(integer1);// 取最⼤值System.out.println(listInt.stream().reduce(Integer::max).orElse(0));System.out.println(listInt.stream().mapToInt(Integer::valueOf).max().getAsInt());// 取最⼩值System.out.println(listInt.stream().reduce(Integer::min).orElse(0));// 取平均值System.out.println(listInt.stream().mapToInt(Integer::valueOf).average().getAsDouble());}输出结果如下三、遍历List集合/*** 遍历对象*/@Testpublic void traverseByJava8(){List<Users> list = produceUser();list.forEach(System.out::println);}输出结果如下四、过滤List集合/*** 过滤对象*/@Testpublic void filterByJava8() {List<Users> list = produceUser();System.out.println("原始数据为:");System.out.println("==============过滤后的数据为===============");list.forEach(System.out::println);//筛选出年龄⼤于3岁⼩于8岁的对象List<Users> collect = list.stream().filter(s -> s.getAge() > 13 && s.getAge() < 18).collect(Collectors.toList()); System.out.println("过滤结束后的数据为:");collect.forEach(System.out::println);}输出结果如下五、获取List中的最⼤最⼩值5.1 根据特定需求中的某个字段求最⼤最⼩/*** 求最⼤最⼩值,根据业务类型选择合适的类型值*/@Testpublic void maxOrMinByJava8() {List<Users> list = produceUser();//根据mapTO**得到最⼤最⼩ ---写法⼀double asDouble = list.stream().mapToDouble(Users::getAge).max().getAsDouble(); System.out.println("将最⼤值转换为Double类型进⾏展⽰,最⼤为:" + asDouble);double asDouble1 = list.stream().mapToDouble(Users::getAge).min().getAsDouble(); System.out.println("将最⼩值转换为Double类型进⾏展⽰,最⼩为:" + asDouble1);int asInt = list.stream().mapToInt(Users::getAge).max().getAsInt();System.out.println("将最⼤值转换为Int类型进⾏展⽰,最⼤为:" + asInt);//根据map得到最⼤最⼩ ---写法⼆(推荐)Integer integer = list.stream().map(Users::getAge).max(Integer::compareTo).get();System.out.println("将最⼤值转换为字段对应类型进⾏展⽰,最⼤为:" + integer);Integer integer1 = list.stream().map(Users::getAge).min(Integer::compareTo).get();System.out.println("将最⼩值转换为字段对应类型进⾏展⽰,最⼩为:" + integer1);}输出结果如下5.2 根据特定需求中的某个字段求平均值/*** 求最⼤最⼩值,根据业务类型选择合适的类型值*/@Testpublic void avgByJava8() {List<Users> list = produceUser();double avgAge = list.stream().mapToDouble(Users::getAge).average().getAsDouble(); System.out.println("平均年龄为:" + avgAge);}输出结果如下六、根据需求将List转为Map/*** List -> Map* 需要注意的是:* toMap 如果集合对象有重复的key,会报错Duplicate key ....* user1,user2的id都为1。

JavaList的sort()方法改写compare()实现升序,降序,倒序的案例

JavaList的sort()方法改写compare()实现升序,降序,倒序的案例

JavaList的sort()⽅法改写compare()实现升序,降序,倒序的案例本⽂旨在通过重写Comparator接⼝的compare()⽅法实现对List的升序、降序、倒序排序。

⾸先明确⼀点:compare(Integer o1, Integer o2){}中,o1代表的是List容器中的后⼀个元素,o2代表的是List容器中的前⼀个元素!通过以下例⼦可以清晰了解这⼀点:public static void main(String[] args) {List<Integer> list = new ArrayList<Integer>();list.add(1);list.add(2);list.add(3);list.sort(new Comparator<Integer>() {public int compare(Integer o1, Integer o2) {System.out.println(o1 + "," + o2);//输出o1,o2return 0;}});}输出为:2,13,2升序代码:public static void main(String[] args) {List<Integer> list = new ArrayList<Integer>();list.add(1);list.add(2);list.add(3);list.sort(new Comparator<Integer>() {public int compare(Integer o1, Integer o2) {if(o1>o2)return 1;//第⼆个元素(o1)⽐第⼀个元素(o2)⼤,返回1if(o1==o2)return 0;return -1;}//1,0,-1三者同时出现时,1表⽰不交换位置,0表⽰相等时不交换,-1表⽰交换});System.out.println(list.toString());}输出:[1,2,3]降序代码:public static void main(String[] args) {List<Integer> list = new ArrayList<Integer>();list.add(1);list.add(2);list.add(3);list.sort(new Comparator<Integer>() {public int compare(Integer o1, Integer o2) {if(o1>o2)return -1;//第⼆个元素(o1)⽐第⼀个元素(o2)⼤,返回-1if(o1==o2)return 0;return 1;}//1,0,-1三者同时出现时,1表⽰不交换位置,0表⽰相等时不交换,-1表⽰交换});System.out.println(list.toString());输出:[3,2,1]倒序代码:public static void main(String[] args) {List<Integer> list = new ArrayList<Integer>();list.add(1);list.add(2);list.add(3);list.sort(new Comparator<Integer>() {public int compare(Integer o1, Integer o2) {return -1;}//倒序就直接返回-1});System.out.println(list.toString());}输出:[3,2,1]补充:Java中对List集合内的元素进⾏顺序、倒序、随机排序的⽰例代码我就废话不多说了,⼤家还是直接看代码吧~import java.util.Collections;import java.util.LinkedList;import java.util.List;public class Test {List list = new LinkedList();public static void main(String[] args) {List list = new LinkedList();for ( int i = 0 ; i < 9 ; i ++ ) {list.add( " a " + i);}Collections.sort(list); // 顺序排列System.out.println(list);Collections.shuffle(list); // 混乱的意思System.out.println(list);Collections.reverse(list); // 倒序排列System.out.println(list);System.out.println(Collections.binarySearch(list, " a5 " )); // 折半查找}}补充:java8根据两个字段排序(⼀正序⼀倒叙)List<Student> collect2 = list.stream().sorted(paring(Student::getAge).reversed().thenComparing(Student::getScore)).collect(Collectors.toList());以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、插入排序1、基本思想插入排序(以升序为例)的基本操作是将一个数插入到一个已经排好序的数据序列中,插入后的数据序列是有序的并且元素个数加一。

插入排序的主要思想是:假设要排序的数组为A[]元素个数为n,将这个数组分为两个部分前n-1个元素和最后一个元素,将最后一个元素插入到已经排好序的n-1个元素中的合适的位置。

InsertSort(A[n]) //对A[n]进行插入排序{for i=1 to ndivide(A[i-1],a[i]) //将A[i]分为两部分,前i-1个元素和最后一个元素Insert(a[i],A[i-1])//将最后一个元素插入到排好序的前i-1个元素中}2、算法复杂度分析插入排序存在着最好情况和最坏情况,最好的情况是已经是排好序的了,这时只需比较n-1次即可;最坏的情况是序列是降序的需要排成升序的,那么此时就需要比较n(n-1)/2。

插入排序的赋值操作是比较操作的次数加上n-1次。

平均来说插入排序的算法复杂度为O(n2)。

3、编程实现public static void InsertSort(int[] A){for(int i=1;i<A.length;i++){int temp=A[i];//存储要插入的元素int j=i;//将temp与A[j-1]中的数进行比较,插入到合适的位置while(j>0&&A[j-1]>=temp){A[j]=A[j-1];j--;}A[j]=temp;}}二、冒泡排序1、基本思想冒泡排序(以升序为例)的基本思想是:依次比较相邻的两个数,将小数放在前面,大数放在后面,第一轮比较后,最大的数便被放到了最后;第二轮操作前n-1个数据(假设有n个数据),依然是依次比较相邻的两个数,将小数放在前面,大数放在后面,倒数第二个数便是第二大的数;同理第i轮操作前n-i+1的数据(假设i取值是从1开始的),则n-i+i位置上的数据为第i大的数据。

一共有n-1轮,第i轮比较中共比较n-i次比较。

BubbleSort(A[n]){for(i=1;i<n;i++)for(j=0;j<n-i;j++)if(A[j]>A[j+1]) A[j]?A[j+1];//交换次序}2、算法复杂度分析一共有次比较,最好情况下没有赋值运算,而最坏的情况下有3次赋值运算,因此该算法复杂度为O(n2)。

3、编程实现排序后的结果为升序public static void BubbleSort(int[] A){int temp=0;for (int i = 1; i < A.length ; i++) {for (int j = 0; j < A.length - i ; j++){//将大数往后放if (A[j]>A[j + 1]){temp=A[j];A[j]=A[j + 1];A[j + 1]=temp;}}}}4、改进的冒泡排序算法若冒泡排序在某轮循环中已经排好了序,此时就不需要进行下一轮的循环。

因此改进的方法是对在比较中是否发生数据交换进行标识。

如设置一个布尔量flag,进行比较前将其值设置为true,若发生了数据交换则将flag设置为false,一轮比较完成后,判断flag的值为true 则结束排序,否则进行下一轮的比较。

改进后的冒泡排序时间复杂度为O(n2)。

public static void BubbleSort(int[] A){int temp=0;for (int i = 1; i < A.length &&flag=false; i++) {boolean flag=true;for (int j = 0; j < A.length - i +1; j++){//将大数往后放if (A[j]>A[j + 1]){temp=A[j];A[j]=A[j + 1];A[j + 1]=temp;flag=false;}}}}三、堆排序1、基本思想堆排序的基本思想是:首先将待排序的记录序列构造成一个堆,这时堆的头结点既是最大元素,将其和最后一个记录交换;然后将除了最后一个记录的记录序列再调整成堆,这样就找出了次大的元素,以此类推,直到堆中只有一个记录为止。

调整堆的思想是将待调整的结点的左右孩子进行比较选出较大的一个和待调整结点进行比较,若待调整结点小则交换,否则调整结束。

创建堆得思想是从第n个结点的父结点开始到第1个结点逐个扫描,每一次扫描将以当前结点为根的子树转换成堆。

HeapSort(A){MakeHeap(A)//构造出一个堆for j←n down to 2 doSwap(A[1],A[j])//交换头结点和最后一个记录Siftdown(A[1,……,int((j-1)/2)] ,1)//调整堆end for}Siftdown(H,i){if 2i>n then exit //若下到了叶子结点则退出repeat i←2i//寻找待下移结点的左右孩子中较大的一个if i+1<=n and H[i+1]>H[i] theni←i+1end if//若待下移结点比左右孩子中较大的一个小则交换if H[int(i/2)]<H[i] thenSwap(H[int(i/2)],H[i])else break //若待下移结点比左右孩子大则调整结束end if}MakeHeap(A){ i←n //总共有n个元素m←int(i/2)for j←m down to 1 //从第n个元素的父结点开始到第1个元素do Sift-down(A[m,m+1,……,n],i) //即父结点小于孩子结点则进行交换end for}2、算法复杂度分析堆排序的时间复杂度主要有构造堆和调整堆这两部分的时间复杂度构成,构造堆的时间复杂度在最坏的情况下是O(n),调整堆的时间复杂度为O(log2n)。

因此堆排序的大致时间复杂度可以写成O(n)+(n-1)(1+O(log2n)),即时间复杂度为O(nlog2n)。

3、编程实现public static void HeapSort(int[] A){//MakeHeap(A)将数组A构建成堆for(int i=A.length/2;i>0;i--)Siftdown(A,i,A.length);//数组A,要下移的元素为A[i]for(int i = A.length ; i >1 ; i--){//交换头结点和最后一个元素int temp=A[1];A[1]=A[i];A[i]=temp;Shiftdown(A, 1,i-1);//调整堆}}private static void shiftDown(int[] A, int i,int n){while(2*i<n){j=2*i;//找出最大的孩子if((j+1<n)&&A[j+1]>A[j])j=j+1;//待下移结点和最大的孩子进行比较,若小则下移否则调整结束if(A[i]<A[j]){int temp=H[i];H[i]=H[j];H[j]=temp;}else break;}}四、合并排序1、基本思想合并排序的基本操作是:首先将待排序序列划分为两个长度相等的子序列;然后分别对两个子序列进行归并排序,得到两个有序的子序列;最后将两个有序的子序列合并成一个有序数列。

MergeSort(A[2*n]){divide A[2*n] into A[1,……,n],A[n-1,……,2*n];//划分MergeSort(A[1,……,n]);//归并排序前半个子序列MergeSort(A[[n-1,……,2*n]);//归并排序后半个子序列Merge;//合并}2、算法复杂度分析合并步的时间复杂度为O(n)。

合并排序算法的时间复杂度为O(nlog2n)。

3、编程实现public int[] MergeSort(int[] A, int[] tempA, int s, int t){//如果序列中有一个以上的元素,即s<t则进行排序if(s < t){int center = (s + t) / 2;MergeSort(A, tempA, s, center);//归并排序前半个子序列MergeSort(A, tempA, center + 1, t);//归并排序后半个子序列Merge(A,tempA, s, center, t);//合并}return tempA;}public int[] Merge(int[] A, int[] tempA, int s, int m, int t){int n = t- s + 1;//n为数据总个数int i=s;j=m+1;k=swhile(i <= m&& j <= t){//取A[i]和A[j]中较小者放入tempA[k]if(A[i]<=A[j]){tempA[k++] = A[i++];}else{tempA[k++] = A[j++];}}if(i<=m)while(i<=m)tempA[k++]=A[i++];//处理前一个子序列else while(j<=t)tempA[k++]=A[j++];//处理后一个子序列return tempA;}五、快速排序1、基本思想快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

QuickSort(A,first,end){if first<end thenm=Partition(A,first,end)//将数据分割成独立的两部分QuickSort(A,first,m-1)//递归的对左侧子序列进行快速排序QuickSort(A,m+1t,end)//递归的对右侧子序列进行快速排序end if}其中通过一趟排序将要排序的数据分割成独立的两部分的基本操作步骤如下:1)设置两个变量i、j,排序开始的时候:i=fist,j=end;取第一个数组元素作为基准元素。

2)将基准元素和j指向的元素进行比较,如果j指向的元素大则j--;重复直到j指向的元素小并i<j,则将基准元素和j所指向的元素进行交换。

3)将基准元素和i指向的元素进行比较,如果i指向的元素小则i--;重复直到i指向的元素大并i<j,则将基准元素和i所指向的元素进行交换。

相关文档
最新文档