Java.util.Collections
集合框架工具类Collections,其方法都是静态的,本身没有构造函数。
常见方法:
static <T extends Comparable<? super T>> void sort(List<T> list)
package Day17; import java.util.*; public class CollectionsDemo { public static void main(String[] args) { sortDemo(); } public static void sortDemo() { List<String> list = new ArrayList<String>(); list.add("abcd"); list.add("aaa"); list.add("abzcd"); list.add("kkk"); list.add("qq"); System.out.println("排序前:"+list); Collections.sort(list); System.out.println("排序后:"+list); } }
运行结果:
排序前:[abcd, aaa, abzcd, kkk, qq] 排序后:[aaa, abcd, abzcd, kkk, qq]
static <T> void sort(List<T> list,Comparator<? super T>,c)加入比较器后的sort。
package Day17; import java.util.*; public class CollectionsDemo { public static void main(String[] args) { sortDemo(); } public static void sortDemo() { List<String> list = new ArrayList<String>(); list.add("abcd"); list.add("aaa"); list.add("abzcd"); list.add("kkk"); list.add("qq"); list.add("qq"); System.out.println("排序前:"+list); Collections.sort(list,new StrLengComparator()); System.out.println("按照长度排序后:"+list); } } class StrLengComparator implements Comparator<String> { public int compare(String s1,String s2) { if(s1.length()==s2.length()) return s1.compareTo(s2); return s1.length()-s2.length(); } }
运行结果:
排序前:[abcd, aaa, abzcd, kkk, qq, qq] 按照长度排序后:[qq, qq, aaa, kkk, abcd, abzcd]
public static <T extends Object & Comparable<? super T>> max(Collection<? extends T> coll)根据元素的自然顺序,返回给定的Collection的最大元素。Collection中的所有元素都必须实现Comparable接口。此外,Collection中的所有元素都必须是可相互比较的(也就是,对于collection中的任意e1和e2元素,e1.caompareTo(e2)不得抛出ClassCastException)。此方法在整个collection上进行迭代,所以他需要的时间与collection的大小成正比。
static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key)使用二分搜索法搜索指定列表,以获得指定对象。(如果找不到该元素返回-index-1)
package Day17; import java.util.*; public class CollectionsDemo { public static void main(String[] args) { binarySearchDemo(); } public static void binarySearchDemo() { List<String> list = new ArrayList<String>(); list.add("abcd"); list.add("aaa"); list.add("abzcd"); list.add("kkk"); list.add("qq"); list.add("qq"); System.out.println("排序前:"+list); int index = Collections.binarySearch(list,"abcd");//使用集合工具 System.out.println("index="+index); int index_my = myBinarySearch(list,"abcd");//使用自定义的二分查找法 System.out.println("index_my="+index_my); } public static int myBinarySearch(List<String> list, String key) { int max,min,mid; max = list.size()-1; min = 0; while (min <= max ) { mid = (max + min) >> 1; int num = list.get(mid).compareTo(key); if (num>0) max = mid-1; else if (num<0) min = mid+1; else return mid; } return -min-1;//如果找不到返回-index-1 } }
运行结果:
排序前:[abcd, aaa, abzcd, kkk, qq, qq] index=0 index_my=0
上面如果使用自定义的比较器,则
package Day17; import java.util.*; public class CollectionsDemo { public static void main(String[] args) { binarySearchDemo(); } public static void binarySearchDemo() { List<String> list = new ArrayList<String>(); list.add("abcd"); list.add("aaa"); list.add("abzcd"); list.add("kkk"); list.add("qq"); list.add("qq"); System.out.println("排序前:"+list); int index = Collections.binarySearch(list,"abcd");//使用集合工具 System.out.println("index="+index); int index_my = myBinarySearch(list,"abcd",new StrLengComparator());//使用自定义的二分查找法 System.out.println("index_my="+index_my); } public static int myBinarySearch(List<String> list, String key,Comparator cmp) { int max,min,mid; max = list.size()-1; min = 0; while (min <= max ) { mid = (max + min) >> 1; int num = cmp.compare(list.get(mid),key); if (num>0) max = mid-1; else if (num<0) min = mid+1; else return mid; } return -min-1;//如果找不到返回-index-1 } } class StrLengComparator implements Comparator<String> { public int compare(String s1,String s2) { if(s1.length()==s2.length()) return s1.compareTo(s2); return s1.length()-s2.length(); } }
static <T> void fill(List<? super T> list, T obj>)使用指定元素替换指定列表中的所有元素。
package Day17; import java.util.*; public class CollectionsDemo2 { public static void main(String[] args){ List<String> list = new ArrayList<String>(); list.add("abcd"); list.add("aaa"); list.add("zz"); list.add("kkkk"); System.out.println("使用fill前:"+list); Collections.fill(list, "pp"); System.out.println("使用fill后:"+list); } }
运行结果:
使用fill前:[abcd, aaa, zz, kkkk] 使用fill后:[pp, pp, pp, pp]
static <T> boolean replaceAll(List<T> list, T oldVal, T newVal),将List集合中的指定元素替换成新元素。
package Day17; import java.util.*; public class CollectionsDemo2 { public static void main(String[] args){ List<String> list = new ArrayList<String>(); list.add("abcd"); list.add("aaa"); list.add("zz"); list.add("kkkk"); System.out.println("使用replaceAll前:"+list); //Collections.fill(list, "pp"); //System.out.println("使用fill后:"+list); Collections.replaceAll(list,"aaa","zzz"); System.out.println("使用replaceAll后:"+list); } }运行结果:
使用replaceAll前:[abcd, aaa, zz, kkkk] 使用replaceAll后:[abcd, zzz, zz, kkkk]
static <T> Comparator <T> reverseOrder(),返回一个比较器,可以强行逆转使用了Comparable接口的对象collection的自然排序。
未使用reverseOrder前:
package Day17; import java.util.*; public class CollectionsDemo3 { public static void main(String[] args){ TreeSet<String> ts = new TreeSet<String>(); ts.add("abcde"); ts.add("aaa"); ts.add("kkk"); ts.add("ccc"); for (Iterator it = ts.iterator(); it.hasNext(); ){ System.out.println(it.next()); } } } 运行结果: aaa abcde ccc kkk
使用reverseOrder后:
package Day17; import java.util.*; public class CollectionsDemo3 { public static void main(String[] args){ TreeSet<String> ts = new TreeSet<String>(Collections.reverseOrder()); ts.add("abcde"); ts.add("aaa"); ts.add("kkk"); ts.add("ccc"); for (Iterator it = ts.iterator(); it.hasNext(); ){ System.out.println(it.next()); } } } 运行结果: kkk ccc abcde aaa
并且该方法的重载方法static <T> Collection<T> reverseOrder(Comparator<T> cmp),可以强行逆转指定比较器的顺序。
static <T> List<T> synchronizedList(List<T> list),返回指定列表的线程同步(线程安全)的列表。