Java容器自定义排序(List、Set、Map)整理

(一)List的自定义排序

List分为LinkedList和ArrayList两种,但它们在排序方法上并没有区别,下面以ArrayList为例,如需LinkedList,只需将关键字ArrayList改为LinkedList。

1、调用Collections类中的sort函数进行自定义排序。

package Test;

import java.util.*;

public class Main {

	public static void main(String[] args) {
		List<String> strlist = new ArrayList<String>();
		strlist.add("b");
		strlist.add("c");
		strlist.add("a");
		System.out.println("排序前:" + strlist);

		// 调用Collections类中的sort函数进行自定义排序。
		Collections.sort(strlist, new Comparator<String>() {
			@Override
			public int compare(String o1, String o2) {
				if (o1.compareTo(o2) > 0) {
					return 1;
				} else {
					return -1;
				}
			}
		});

		System.out.println("排序后:" + strlist);

	}

}

2、在类的外部定义排序类,适用于需要多种排序的时候(比如学生类,我想先用姓名排序,再用年龄排序,再用学号排序……)

package Test;

import java.util.*;

public class Main {

	public static void main(String[] args) {
		List<String> strlist = new ArrayList<String>();
		strlist.add("b");
		strlist.add("c");
		strlist.add("a");
		System.out.println("排    序    前:" + strlist);

		// 在外部定义排序类进行排序
		Collections.sort(strlist, new SortAscending());
		System.out.println("升序排序后:" + strlist);
		
		Collections.sort(strlist, new SortDescending());
		System.out.println("降序排序后:" + strlist);

	}

}

class SortAscending implements Comparator {

	@Override
	public int compare(Object o1, Object o2) {
		String s1 = (String) o1;
		String s2 = (String) o2;
		if (s1.compareTo(s2) > 0) {
			return 1;
		} else {
			return -1;
		}
	}

}
class SortDescending implements Comparator {

	@Override
	public int compare(Object o1, Object o2) {
		String s1 = (String) o1;
		String s2 = (String) o2;
		if (s1.compareTo(s2) > 0) {
			return -1;
		} else {
			return 1;
		}
	}

}

(二)Set的自定义排序

首先说明一点:HashSet是“无序的”(它是依据哈希码进行默认排序的),TreeSet是有序的(默认升序)

1、第一种方法,将Set内的元素赋给一个List,然后调用List的排序方法。

package Test;

import java.util.*;

public class Main {

	public static void main(String[] args) {
		Set<String> strset = new HashSet<String>();//TreeSet相同
		strset.add("b");
		strset.add("c");
		strset.add("a");
		
		//定义一个List,将Set内的元素赋给List,然后调用List的排序方法
		List<String> templist = new ArrayList<String>(strset);
		Collections.sort(templist);//可根据上文自定义

	}

}

2、直接定义TreeSet,调用其构造方法TreeSet(Comparator<? super E> comparator) 直接进行自定义排序

package Test;

import java.util.*;

public class Main {

	public static void main(String[] args) {
		Set<String> strset = new TreeSet<String>(new SortDescending());
		strset.add("b");
		strset.add("c");
		strset.add("a");
		System.out.println("直接排序:" + strset);

	}

}

class SortDescending implements Comparator {
	@Override
	public int compare(Object o1, Object o2) {
		String s1 = (String) o1;
		String s2 = (String) o2;
		if (s1.compareTo(s2) > 0) {
			return -1;
		} else {
			return 1;
		}
	}
}

(三)Map的自定义排序

map与set类似,TreeMap也是默认排好序的(以键值升序),HashMap是无序的

1、用一个辅助List

package Test;

import java.util.*;
import java.util.Map.Entry;

public class Main {

	public static void main(String[] args) {
		Map<String, Integer> map = new HashMap<String, Integer>();
		map.put("d", 2);
		map.put("c", 1);
		map.put("b", 1);
		map.put("a", 3);

		List<Map.Entry<String, Integer>> templist = new ArrayList<Map.Entry<String, Integer>>(map.entrySet());

		Collections.sort(templist, new Comparator<Map.Entry<String, Integer>>() {

			@Override
			public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
				 return (o2.getValue() - o1.getValue());
				//return (o1.getKey()).toString().compareTo(o2.getKey());

			}

		});

		for (int i = 0; i < templist.size(); i++) {
			String id = templist.get(i).toString();
			System.out.println(id);
		}

	}
}

2、和TreeSet类似,直接调用TreeMap的构造方法

package Test;

import java.util.*;
import java.util.Map.Entry;

public class Main {

	public static void main(String[] args) {
		Map<String, Integer> map = new TreeMap<String, Integer>(new Comparator<String>() {
			@Override
			public int compare(String o1, String o2) {
				 return o1.compareTo(o2);
				//return (o1.getKey()).toString().compareTo(o2.getKey());

			}
		});
		map.put("d", 2);
		map.put("c", 1);
		map.put("b", 1);
		map.put("a", 3);

		Set<String> keySet = map.keySet();
		Iterator<String> it = keySet.iterator();
		while(it.hasNext()) {
			String key=it.next();
			System.out.println(key+":"+map.get(key));
		}

	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值