java容器排序(sort)

java sort

关于Java容器,可以看这篇文章:https://www.cnblogs.com/jiading/articles/12411238.html

我们在这篇文章中对所有的容器类的实现类和数组的sort方法进行分析,它们分别是:

img

1)collection: ArrayList,LinkedLsit,Vector,Stack

       TreeSet,HashSet,LinkedHashSet

  1. Map:    HashMap,LinkedHashMap,WeakHashMap, TreeMap, HashTable, IdentityHashTable(其中 key 的比较是通过 == 而不是 equals)

3)数组:int[]


  1. 对于List的实现类:ArrayList\LinkedList\Vector\Stack,都有.sort()方法,可以直接调用。Collections包下也提供了静态的sort方法,可以使用Collections.sort()调用,但是它的实现是:

        public static <T extends Comparable<? super T>> void sort(List<T> list) {
            list.sort((Comparator)null);
        }
    

    所以和直接调用list对象的sort方法没区别

  2. HashSet和LinkedHashSet不可排序,他们两个的区别是HashSet中元素是无顺序的,而LinkedHashSet中元素是和插入顺序一致的

  3. TreeSet是默认排序的,默认还是字典序,如果不是可以用字典序排序的元素或者不想用字典序排序,可以在构造的时候传入Comparator对象:

     Set<String> sortSet = new TreeSet<String>(new Comparator<String>() {
                @Override
                public int compare(String o1, String o2) {
                    return o2.compareTo(o1);//降序排列
                }
            });
    
  4. HashMap和LinkedHashMap同样不可排序,和HashSet和LinkedHashSet一样,LinkedHashMap同样记录了插入顺序

  5. Map的排序一般使用TreeMap,它默认也是字典序,也可以通过在构造时传入Comparator对象来改变排序规则

    Map<String, String> map = new TreeMap<String, String>(
                    new Comparator<String>() {
                        public int compare(String obj1, String obj2) {
                            // 降序排序
                            return obj2.compareTo(obj1);
                        }
                    });
    

    上面是通过key排序,但有时候我们需要通过value排序,这是没有支持的方法的,需要我们自己构造,构造的原理就是先将其取出来放到List中,再自定义排序规则对List进行排序,最后再放回Map

    public Map<String, String> sortMapByValue(Map<String, String> oriMap) {
    		Map<String, String> sortedMap = new LinkedHashMap<String, String>();
    		if (oriMap != null && !oriMap.isEmpty()) {
    			List<Map.Entry<String, String>> entryList = new ArrayList<Map.Entry<String, String>>(oriMap.entrySet());
    			Collections.sort(entryList,
    					new Comparator<Map.Entry<String, String>>() {
    						public int compare(Entry<String, String> entry1,
    								Entry<String, String> entry2) {
    							int value1 = 0, value2 = 0;
    							try {
    								value1 = getInt(entry1.getValue());
    								value2 = getInt(entry2.getValue());
    							} catch (NumberFormatException e) {
    								value1 = 0;
    								value2 = 0;
    							}
    							return value2 - value1;
    						}
    					});
    			Iterator<Map.Entry<String, String>> iter = entryList.iterator();
    			Map.Entry<String, String> tmpEntry = null;
    			while (iter.hasNext()) {
    				tmpEntry = iter.next();
    				sortedMap.put(tmpEntry.getKey(), tmpEntry.getValue());
    			}
    		}
    		return sortedMap;
    	}
    
  6. 对于数组,可以使用Arrays.sort()方法。方法接口如下,可以看到各种基本类型的数组都可以sort:

  1. 对于字符串,如果要对字符串内的字符排序,可以先使用string.toCharArray()方法转换为字符数组,然后使用new String()将字符数组传入以得到字符串。注意不能直接通过Arrays.toString()方法获取字符串,这样得到的是一个字符串形式的数组

    这里要注意,Arrays千万不要错写为Array,那个是反射的包,表示Array类

posted @ 2020-03-05 10:57  别再闹了  阅读(988)  评论(0)    收藏  举报