1.1 sort
自定义比较器,传入Collections.sort参数中。
Collections.sort(list,newStrLenComparator());
public static void sortDemo()
{
List<String> list=new ArrayList<String>();
list.add("i");
list.add("eeeee");
list.add("ri");
list.add("fie");
list.add("z");
list.add("tettr");
sop(list);
Collections.sort(list,new StrLenComparator());//传入一个集合和比较器
sop(list);
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
class StrLenComparator implements Comparator<String>
{
public int compare(String s1,String s2)
{
int num=new Integer(s1.length()).compareTo(new Integer(s2.length()));
if(num==0)
return s1.compareTo(s2);//先比较长度再比较字母顺序
return num;
}
}调用静态方法后的结果:
[i, eeeee, ri, fie, z, tettr]
[i, z, ri, fie, eeeee, tettr]
1.2 Max
Collections.max(list);
Collections.max(list,newStrLenComparator());
public static void maxDemo()
{
List<String> list=new ArrayList<String>();
list.add("i");
list.add("eeeee");
list.add("ri");
list.add("fie");
list.add("z");
list.add("tetr");
sop(list);
String max1=Collections.max(list);
String max=Collections.max(list,new StrLenComparator());
sop(max1);
sop(max);
}结果
[i, eeeee, ri, fie, z, tetr]
Z //自然顺序的最大值
eeeee//长度的最大值
1.3 二分查找
传入list和key,也可以再加上比较器
注意:
使用比较器的比较方法时,原list需要先按照比较器方法进行排序
public static void binarySearchDemo()
{
List<String> list=new ArrayList<String>();
list.add("i");
list.add("eeeee");
list.add("ri");
list.add("fie");
list.add("z");
list.add("tetr");
Collections.sort(list);//先排序
sop(list);
//int index=Collections.binarySearch(list,"p");
int index=halfSearch(list,"p");
sop("index="+index);//
}
public static int halfSearch(List<String> list,String key)
{
int max,min,mid;
max=list.size();
min=0;
while(min<=max)
{
mid=(max+min)/2;
String str=list.get(mid);
int num=str.compareTo(key);
if(num>0)
max=mid-1;
else if(num<0)
min=mid+1;
else
return mid;
}
return -min-1;
}结果:
[eeeee, fie, i, ri, tetr, z]
index=-4//3是插入脚标
1.4 Collections.reverseOrder()
Collections.reverseOrder(传入一个比较器)
逆转传入的比较器
如1.2例子
String max=Collections.max(list,Collections.reverseOrder(newStrLenComparator()) );
打印max的结果是i
1.5 synchronizedList
synchronizedSet
synchronizedMap
传入不同的集合,可以使之成为同步的集合。
1.6 Collections.shuffle(list);
产生随机顺序的集合
可以用来表示骰子点数、洗牌等等
1.7 Collections.replaceAll(list, "a","b");
将集合中所有a元素换成b
1.8 fill方法
Collections.fill(list,str);
将集合list中所有的元素替换成str。
如何替换一个区间呢?
public static void fillDemo(List<String> list,String str,int start,int end)
{
//调用list中的subList方法。
//List<String> sublist = new ArrayList<String>(list.subList(start,end));//不改变原list
List<String> sublist =list.subList(start,end);
//如果直接=list.subList(start,end) 因为subList直接操作的是原集合,所以原集合也会改变
//将sublist中全部替换为str。
sop(list);
sop(sublist);
Collections.fill(sublist,str);
sop(sublist);
sop(list);
}结果
[i, eeeee, ri, fie, z, tetr]
[ri, fie]
[oo, oo]
[i, eeeee, oo, oo, z, tetr]
这里sublist指向的是原有的list集合,所以原集合也发生了改变。
如果想要取出一个区间,要用new方法
List<String>sublist = new ArrayList<String>(list.subList(start,end));
1.9 Collection接口中的toArray方法
String [] arr=al.toArray(newString[5]);
1、指定类型的数组到底要定义多长
当指定类型的数组长度小于了集合的size,那么该方法内部会创建一个新的数组,长度为集合的size
当指定类型的数组长度大于了集合的size,就不会新创建数组,而是使用传递进来的数组
所以创建一个刚好的数组最优
String [] arr=al.toArray(new String[al.size()]);
2、为什么要将集合变成数组
为了限定对元素的操作,变成数组就无法增删
public static void main(String[] args) {
ArrayList<String> al=new ArrayList<String>();
al.add("add1");
al.add("add2");
al.add("add3");
al.add("add4");
String [] arr=al.toArray(new String[5]);
sop(Arrays.toString(arr));
String [] arr1=al.toArray(new String[al.size()]);
sop(Arrays.toString(arr1));
}结果
[add1, add2, add3,add4, null]
[add1, add2, add3, add4]
2. Arrays
asList:将数组变成list集合
1、将数组变成集合,不可以使用集合的增删方法
2、因为数组的长度是固定的
3、contains getindexOf subList都可以
如果进行增删操作会发生不支持的操作异常。
public static void main(String[] args)
{
int [] arr1={2,3,5};
System.out.println(Arrays.toString(arr1));
String [] arr={"aaa","dd","cc"};
//把数组变成集合
List<String> list=Arrays.asList(arr);// [aaa, dd, cc]
sop(list.contains("cc"));
//list.add("qq");不支持的操作异常
sop(list);
int [] num={2,4,5,6};
sop(num);//[I@15db9742 一维数组
List<int[]> li=Arrays.asList(num);
sop(li);//[[I@15db9742] 变成了二维数组
}
本文详细介绍了Java中Collections工具类的多个实用方法,包括排序、查找最大值、二分查找等,并提供了示例代码帮助理解。

被折叠的 条评论
为什么被折叠?



