二维List利用Arrays.sort进行排序

前言

刷leetcode碰到一个题要对二维List进行排序,在这卡了一会,现在找到方法了,在此以List>为例子,做个记录。

正文

需求

有一个二维List,数组中的元素是String,即List>。最外面List里每个元素是一个List< String>,现在要让每个List里所有String拼接为一个String,以字典序进行排序。

解决方案

我使用Arrays自带的sort方法进行,看下源代码:

public static <T> void sort(T[] a, Comparator<? super T> c) {
        if (c == null) {
            sort(a);
        } else {
            if (LegacyMergeSort.userRequested)
                legacyMergeSort(a, c);
            else
                TimSort.sort(a, 0, a.length, c, null, 0, 0);
        }
    }

也就是Arrays.sort()方法第一个参数需要是一个T[],即Object数组,而List并不符合要求,这里需要先将List转为Object数组,即List>可转换为一个List< String>数组,参考https://blog.csdn.net/huanghanqian/article/details/81078799,可以写出对应代码:

List<String> toprint[]=new ArrayList[tot.size()];
tot.toArray(toprint);

这样,toprint数组里每个元素类型都是List,可以看做是一个Object?可以在重写compare方法时进行强转,具体代码如下:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

public class ArraysSortTest {
	public static void main(String[] args) {
		List<List<String>> tot=new ArrayList<>();
		List<String> list2=new ArrayList<>();
		list2.add("d");
		list2.add("e");
		
		List<String> list=new ArrayList<>();
		list.add("a");
		list.add("b");
		tot.add(list2);
		tot.add(list);
	    List<String> toprint[]=new ArrayList[tot.size()];
	    tot.toArray(toprint);
	    System.out.println("------------before sort----------------");
	    for(List<String> temp:toprint) {
	    	for(String x:temp) {
	    		System.out.println(x);
	    	}
	    }
	    System.out.println("---------------after sort--------");
	    Arrays.sort(toprint,new Mycomparator());
	    for(List<String> temp:toprint) {
	    	for(String x:temp) {
	    		System.out.println(x);
	    	}
	    }
	}

}
class Mycomparator implements Comparator<Object>{

	@Override
	public int compare(Object o1,Object o2) {
		if(o1 instanceof List<?> && o2 instanceof List<?>) {//这里必须是List
			List<String> l1=(List<String>) o1;
			List<String> l2=(List<String>) o2;
			String s1="";
			for(String x:l1) {
				s1+=x;
			}
			String s2="";
			for(String x:l2) {
				s2+=x;
			}
			return s1.compareTo(s2);
		}

		return 0;
	}
}

输出结果:
------------before sort----------------
d
e
a
b
---------------after sort--------
a
b
d
e

后记

然而那道leetocde题这么做超时了。。写着写着的时候想到了优化方法,不使用这种暴力排序的方法,应该可行。

PS:
看到了另外一个Sort方法,Collections.sort,可以直接对List进行排序,要求List内元素实现Comparator接口,Collections.sort源码如下:

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

查看list.sort:

@SuppressWarnings({"unchecked", "rawtypes"})
    default void sort(Comparator<? super E> c) {
        Object[] a = this.toArray();
        Arrays.sort(a, (Comparator) c);
        ListIterator<E> i = this.listIterator();
        for (Object e : a) {
            i.next();
            i.set((E) e);
        }
    }

其内部也是将List转化为Object数组,再使用Arrays.sort进行排序。

你可能感兴趣的:(java)