`
elite20130514
  • 浏览: 48253 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

非稳定排序推荐使用list(整理)(五)

阅读更多

Set 和 list 最大的区别是Set中元素不可重复(这个重复指的是equals返回值相同),Set中的常用类TreeSet,该类实现了类默认排序为升序的Set集合,会在插入元素过程中按照升序排列(当然根据Comparable接口中的compareTo返回值确定排序的位置),不过这种方法不适合在元素经常变化的场景中使用,来看下边的例子:

普通pojo类,实现Comparable接口,重现compareTo,equals和hashCode

package sort;

public class Person implements Comparable<Person>{
	
	private int height;
	
	public Person(int _age) {
		height = _age;
	}
	
	
	public int getHeight() {
		return height;
	}


	public void setHeight(int height) {
		this.height = height;
	}


	@Override
	public int compareTo(Person o) {
		// TODO Auto-generated method stub
		return height - o.height;
	}


	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + height;
		return result;
	}


	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (height != other.height)
			return false;
		return true;
	}
	
}

 测试代码

package sort;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;

public class SortTest {
	public static void main(String[] args)throws Exception  {
		SortedSet<Person> set = new TreeSet<Person>();
		//加入集合时进行排序
		set.add(new Person(180));
		set.add(new Person(175));
		
		set.first().setHeight(185);
		//set重排序
		set = new TreeSet<Person>(new ArrayList<Person>(set));
		for(Person p:set) {
			System.out.println(" 身高:"+p.getHeight());
		}
		
		sortList(new Person(190),new Person(180),new Person(175));
	}
	/**
	 * <b>function:</b>list 排序,去重,,泛型等
	 * @param <T>
	 * @param t
	 * @throws Exception
	 */
	public static <T extends Comparable<T>> void sortList(T... t)throws Exception {
		List<T> list = new ArrayList<T>();
		for(T tmp : t) {
			list.add(tmp);
		}
		
		Method method = null;
		for(int i=0,n=list.size();i<n;i++) {
			method = list.get(i).getClass().getMethod("getHeight");
			System.out.println("身高: "+method.invoke(list.get(i)));;
		}
		
		Set<T> set = new HashSet<T>(list);	//Person实现equal 和hashCode
		for(T tmp:set) {
			method = tmp.getClass().getMethod("getHeight");
			System.out.println("set身高: "+method.invoke(tmp));;
		}
	
		Collections.sort(list);			//排序
		for(int i=0,n=list.size();i<n;i++) {
			method = list.get(i).getClass().getMethod("getHeight");
			System.out.println("身高: "+method.invoke(list.get(i)));;
		}
	}
}

 此处补贴出测试结果,读者可以下去做实验。

总结:对于不变量的排序,例如直接量(8个基本类型)、String类型等,推荐使用TreeSet,而对于可变量,则推荐list自行排序。

分享到:
评论

相关推荐

    排序 数据结构课件

    - **链表插入排序**:使用链表而非数组,插入时仅需调整链域,无需移动整个记录。 3. **选择排序**: - **算法原理**:每次从未排序的部分找出最小(或最大)的元素,放到已排序序列的末尾。 - **时间复杂度**:...

    Sort_排序_

    - 稳定排序算法保证相等元素的相对顺序不会改变,如冒泡排序、插入排序、归并排序。 - 不稳定排序算法可能改变相等元素的相对顺序,如快速排序、堆排序。 5. **原地排序**: - 原地排序不需额外的存储空间,如...

    vc函数整理(排序、类型转换、API、系统函数)

    在VC++中,你可以使用标准库中的`std::sort`来对容器(如`std::vector`或`std::list`)进行排序。此外,还存在多种经典的排序算法,如冒泡排序、选择排序、插入排序、快速排序、归并排序和堆排序。每种排序算法都有...

    Java 三种排序方式

    对于大数据量的排序需求,Java的集合框架如`List.sort()`也使用了优化的排序算法,如TimSort,它是一种混合排序算法,既保证了稳定排序,又能在大部分情况下保持O(n log n)的时间复杂度。 总的来说,了解并熟练掌握...

    c#+排序算法大全+经典算法

    7. **计数排序**:计数排序是一种非基于比较的排序算法,适用于整数排序。它统计每个数字出现的次数,然后根据统计结果确定每个元素的位置。对于固定范围内的整数,计数排序可以达到线性时间复杂度O(n+k),其中k是...

    Python排序算法,冒泡排序

    在Python中,还有一个内置的`sorted()`函数和`list.sort()`方法,它们通常使用Timsort算法,这是一种混合排序算法,结合了插入排序和归并排序的优点,具有稳定性和高效性,平均和最坏情况的时间复杂度都是O(n log n)...

    java排序案例

    在实际开发中,我们通常会选择效率更高的排序算法,例如`Arrays.sort()`和`Collections.sort()`使用的都是高效的排序算法(通常是TimSort,一种稳定且高效的混合排序算法,结合了插入排序和归并排序的优点)。...

    数据结构与程序设计20sorting.ppt

    其中,insertion_sort函数使用了插入排序的逻辑,它将列表中的元素重新排列,确保关键字非递减排序。 选择排序是一种简单但效率较低的排序算法,它通过找到未排序部分的最小(或最大)元素,然后将其放到已排序部分...

    C#排序算法大全含数据结构所有算法

    插入排序类似于我们手动整理扑克牌的过程,它将数组分为已排序和未排序两部分,每次从未排序部分取出一个元素,插入到已排序部分的正确位置,直到所有元素都排序完毕。插入排序在最好情况(输入数组已经有序)下时间...

    Python实现的插入排序,冒泡排序,快速排序,选择排序算法示例

    在实际编程中,根据数据规模、是否已排序以及对稳定性、空间复杂度的要求,可以选择合适的排序算法。例如,快速排序通常在大多数情况下表现最好,而插入排序和冒泡排序则更适合小规模数据或部分有序的数据。选择排序...

    C#的四种排序算法:冒泡、选择、插入和希尔

    在实际开发中,还可以利用.NET框架提供的`Array.Sort()`或`List&lt;T&gt;.Sort()`等内置方法,它们通常采用更复杂的排序算法,如快速排序或归并排序,具有更好的平均性能。然而,理解基础排序算法仍然是每个程序员必备的...

    java私塾学习笔记整理

    ### Java私塾学习笔记整理 #### 第一章:Java入门 **一、Java是什么?** Java是一种广泛使用的高级编程语言,由Sun Microsystems于1995年推出。它旨在为跨平台开发提供一种通用的语言环境,使开发者能够在任何...

    Java实现几种常见排序算法代码

    - 插入排序是一种简单直观的排序算法,它的工作方式类似于我们手动整理扑克牌的过程。它将数组分为已排序和未排序两部分,每次从未排序部分取出一个元素,插入到已排序部分的正确位置。 - **Java实现**: ```java...

    数据库期末整理.pdf

    4. 减少交互次数:批量处理,使用IN List,调整Fetch Size,以及适时使用存储过程,但需注意存储过程的移植性和维护难度。 5. 减少服务器CPU开销:使用绑定变量,减少排序和模糊查找,避免复杂计算在数据库层面进行...

    JAVA核心知识点整理

    算法是解决问题的有效手段,常见的排序(如快速排序、归并排序)、搜索(如二分查找)、图算法(如Dijkstra、Floyd)等都需要掌握。良好的算法基础能提升代码效率,优化程序性能。 综上所述,"JAVA核心知识点整理...

    redis学习笔记详细整理手册

    本手册详细整理了Redis的学习过程,包括基础概念、安装部署和实战应用。 一、Redis基础知识 Redis是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。它的数据模型包括字符...

    Python库 | collatex-2.0.0pre12-py3.4.egg

    - **学术文献管理**:在整理和排序大量文献引用时,Collatex可以帮助实现按作者姓名或出版年份的准确排序。 - **文本分析**:在处理多语言文本数据时,可以利用Collatex进行文本排序和比较,帮助提取信息或找出...

    sorting:Python带有单元测试的经典排序算法

    在Python中,内置的`sorted()`函数和`list.sort()`方法已经为我们提供了非常方便的排序功能。但是,了解并实现经典的排序算法可以帮助我们更好地理解数据结构和算法,以及优化代码性能。 1. 冒泡排序(Bubble Sort...

    sorter:python中各种排序算法的实现

    在实际编程中,Python内置了`sorted()`函数和`list.sort()`方法,它们使用了更高效的Timsort算法,这是一种结合了插入排序和归并排序特点的稳定排序算法。不过,了解和实现这些基本排序算法有助于理解排序背后的逻辑...

Global site tag (gtag.js) - Google Analytics