List Map sort 排序

首先介绍一下什么是Map。在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value。这就是我们平时说的键值对。

HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。 
HashMap 非线程安全 TreeMap 非线程安全 

线程安全 
在Java里,线程安全一般体现在两个方面: 
1、多个thread对同一个java实例的访问(read和modify)不会相互干扰,它主要体现在关键字synchronized。如ArrayList和Vector,HashMap和Hashtable 
(后者每个方法前都有synchronized关键字)。如果你在interator一个List对象时,其它线程remove一个element,问题就出现了。 

2、每个线程都有自己的字段,而不会在多个线程之间共享。它主要体现在java.lang.ThreadLocal类,而没有Java关键字支持,如像static、transient那样。 
1.AbstractMap抽象类和SortedMap接口 
AbstractMap抽象类:(HashMap继承AbstractMap)覆盖了equals()和hashCode()方法以确保两个相等映射返回相同的哈希码。如果两个映射大小相等、包含同样的键且每个键在这两个映射中对应的值都相同,则这两个映射相等。映射的哈希码是映射元素哈希码的总和,其中每个元素是Map.Entry接口的一个实现。因此,不论映射内部顺序如何,两个相等映射会报告相同的哈希码。 
SortedMap接口:(TreeMap继承自SortedMap)它用来保持键的有序顺序。SortedMap接口为映像的视图(子集),包括两个端点提供了访问方法。除了排序是作用于映射的键以外,处理SortedMap和处理SortedSet一样。添加到SortedMap实现类的元素必须实现Comparable接口,否则您必须给它的构造函数提供一个Comparator接口的实现。TreeMap类是它的唯一一份实现。 

2.两种常规Map实现 
HashMap:基于哈希表实现。使用HashMap要求添加的键类明确定义了hashCode()和equals()[可以重写hashCode()和equals()],为了优化HashMap空间的使用,您可以调优初始容量和负载因子。 
(1)HashMap(): 构建一个空的哈希映像 
(2)HashMap(Map m): 构建一个哈希映像,并且添加映像m的所有映射 
(3)HashMap(int initialCapacity): 构建一个拥有特定容量的空的哈希映像 
(4)HashMap(int initialCapacity, float loadFactor): 构建一个拥有特定容量和加载因子的空的哈希映像 
TreeMap:基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。 
(1)TreeMap():构建一个空的映像树 
(2)TreeMap(Map m): 构建一个映像树,并且添加映像m中所有元素 
(3)TreeMap(Comparator c): 构建一个映像树,并且使用特定的比较器对关键字进行排序 
(4)TreeMap(SortedMap s): 构建一个映像树,添加映像树s中所有映射,并且使用与有序映像s相同的比较器排序 

3.两种常规Map性能 
HashMap:适用于在Map中插入、删除和定位元素。 
Treemap:适用于按自然顺序或自定义顺序遍历键(key)。 

4.总结 

 

HashMap通常比TreeMap快一点(树和哈希表的数据结构使然),建议多使用HashMap,在需要排序的Map时候才用TreeMap。 

 

 

package com.han.demo;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
/**
 * Map List集合排序
 * @author Administrator
 *
 */
public class MapDemo {
	public static void main(String[] args) {
		Map<String,String> maps=new HashMap<String, String>();
		maps.put("5","b");
		maps.put("6","a");
		maps.put("3","d");
		maps.put("2","e");
		maps.put("4","c");
		maps.put("1","f");
		System.out.println("key排序前------------------------------");
		for(Map.Entry<String, String> entry:maps.entrySet()){
			System.out.println("key:"+entry.getKey()+"-----value:"+entry.getValue());
		}
		List<Map.Entry<String,String>> lists=new ArrayList<Map.Entry<String,String>>();
		lists.addAll(maps.entrySet());
		Collections.sort(lists,new Comparator<Map.Entry<String,String>>() {

			@Override
			public int compare(Entry<String, String> o1, Entry<String, String> o2) {
				return o1.getKey().compareTo(o2.getKey());
			}
		});	
		System.out.println("key排序后------------------------------");
		for(int i=0;i<lists.size();i++){
			System.out.println("key:"+lists.get(i).getKey()+"-----value:"+lists.get(i).getValue());
		}
		
		Collections.sort(lists,new Comparator<Map.Entry<String,String>>() {

			@Override
			public int compare(Entry<String, String> o1, Entry<String, String> o2) {
				return o1.getValue().compareTo(o2.getValue());
			}
		});	
		System.out.println("value排序后------------------------------");
		for(int i=0;i<lists.size();i++){
			System.out.println("key:"+lists.get(i).getKey()+"-----value:"+lists.get(i).getValue());
		}
		
		Map<String,String> treeMap=new TreeMap<String,String>();
		treeMap.put("b","5");
		treeMap.put("a","6");
		treeMap.put("d","3");
		treeMap.put("e","2");
		treeMap.put("c","4");
		treeMap.put("f","1");
		System.out.println("treeMap默认排序------------------------------");
		for(Map.Entry<String, String> entry:treeMap.entrySet()){
			System.out.println("key:"+entry.getKey()+"-----value:"+entry.getValue());
		}
		
		Map<String,String> treeMaps=new TreeMap<String,String>(new Comparator<String>() {

			@Override
			public int compare(String o1, String o2) {
				return o1.compareTo(o2);
			}
		});
		/*treeMaps.put("5","b");
		treeMaps.put("6","a");
		treeMaps.put("3","d");
		treeMaps.put("2","e");
		treeMaps.put("4","c");
		treeMaps.put("1","f");*/
		treeMaps.put("b","5");
		treeMaps.put("a","6");
		treeMaps.put("d","3");
		treeMaps.put("e","2");
		treeMaps.put("c","4");
		treeMaps.put("f","1");
		System.out.println("treeMap排序后------------------------------");
		for(Map.Entry<String, String> entry:treeMaps.entrySet()){
			System.out.println("key:"+entry.getKey()+"-----value:"+entry.getValue());
		}
		List<Map.Entry<String,String>> treeLists=new ArrayList<Map.Entry<String,String>>();
		treeLists.addAll(treeMaps.entrySet());
		Collections.sort(treeLists,new Comparator<Map.Entry<String,String>>() {

			@Override
			public int compare(Entry<String, String> o1, Entry<String, String> o2) {
				return o1.getValue().compareTo(o2.getValue());
			}
		});	
		System.out.println("treeMap value排序后------------------------------");
		for(Map.Entry<String, String> entry:treeLists){
			System.out.println("key:"+entry.getKey()+"-----value:"+entry.getValue());
		}
		
		//根据对象属性排序
		List<User> users=new ArrayList<User>();
		User u=new User("张三","11111",22);
		users.add(u);
		u=new User("王五","22222",21);
		users.add(u);
		u=new User("赵六","66665",25);
		users.add(u);
		u=new User("李四","55555",26);
		users.add(u);
		System.out.println("user对象排序前------------------------------");
		for (User user : users) {
			System.out.println("姓名:"+user.getUserName()+"  密码:"+user.getPassword()+"   年龄:"+user.getAge());
		}
		System.out.println("user排序后------------------------------");
		Collections.sort(users);
		for (User user : users) {
			System.out.println("姓名:"+user.getUserName()+"  密码:"+user.getPassword()+"   年龄:"+user.getAge());
		}
		
		
	}
	/**
	 * 根据对象属性排序需要实现Comparator接口实现compare方法
	 *
	 */
	static class User implements Comparable<User>{
		private String userName;
		private String password;
		private int age;
		public String getUserName() {
			return userName;
		}
		public void setUserName(String userName) {
			this.userName = userName;
		}
		public String getPassword() {
			return password;
		}
		public void setPassword(String password) {
			this.password = password;
		}
		public int getAge() {
			return age;
		}
		public void setAge(int age) {
			this.age = age;
		}
		public User() {
		}
		public User(String userName, String password, int age) {
			this.userName = userName;
			this.password = password;
			this.age = age;
		}
		/*@Override
		public int compare(User o1, User o2) {
			return o1.getAge()-o2.getAge();
		}*/
		@Override
		public int compareTo(User o) {
			//return this.userName.compareTo(o.userName);
			return this.age-o.getAge();
			//return this.password.compareTo(o.getPassword());
		}
	}
}


运行结果:

 

 

key排序前------------------------------
key:3-----value:d
key:2-----value:e
key:1-----value:f
key:6-----value:a
key:5-----value:b
key:4-----value:c
key排序后------------------------------
key:1-----value:f
key:2-----value:e
key:3-----value:d
key:4-----value:c
key:5-----value:b
key:6-----value:a
value排序后------------------------------
key:6-----value:a
key:5-----value:b
key:4-----value:c
key:3-----value:d
key:2-----value:e
key:1-----value:f
treeMap默认排序------------------------------
key:a-----value:6
key:b-----value:5
key:c-----value:4
key:d-----value:3
key:e-----value:2
key:f-----value:1
treeMap排序后------------------------------
key:a-----value:6
key:b-----value:5
key:c-----value:4
key:d-----value:3
key:e-----value:2
key:f-----value:1
treeMap value排序后------------------------------
key:f-----value:1
key:e-----value:2
key:d-----value:3
key:c-----value:4
key:b-----value:5
key:a-----value:6
user对象排序前------------------------------
姓名:张三  密码:11111   年龄:22
姓名:王五  密码:22222   年龄:21
姓名:赵六  密码:66665   年龄:25
姓名:李四  密码:55555   年龄:26
user排序后------------------------------
姓名:王五  密码:22222   年龄:21
姓名:张三  密码:11111   年龄:22
姓名:赵六  密码:66665   年龄:25
姓名:李四  密码:55555   年龄:26

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 " )); // 折半查找 
    } 
    
}

 

 

 

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值