黑马程序员----集合工具类(Arrays和Collections)

时间:2023-02-24 23:02:22

——- android培训java培训、期待与您交流! ———-


集合工具类(Untilities)

1.Arrays:

用于操作数组的工具类,里面都是静态方法。

asList:将数组变成List集合。

把数组变成list集合有什么好处?
可以使用集合的思想和方法来操作数组中的元素。
注意:将数组变成集合不可以使用集合的增删方法,因为数组的长度是固定的。如果使用了增删功能,会发生不支持操作异常。(其他方法可以正常使用)。

public class Arrays_0 
{
public static void main(String[] args)
{
int[] arr={2,4,5};

System.out.println(Arrays.toString(arr));

String[] arr1={"abc","bcd","fghggv"};
List<String> list =Arrays.asList(arr1);
System.out.println("contains:"+list.contains("bcd"));

//list.add("qq");//UnsupportedOperationException:不被支持的操作异常;

System.out.println(list);

List<int[]> li=Arrays.asList(arr);
System.out.println(li);//结果:[[I@1b48197] 是一个数组的哈希值;

//如果数组中的元素都是对象,那么变成集合时,数组中的元素就直接转成集合中的元素。
//如果数组中的元素都是基本数据类型,那么会将该数组作为集合中的元素存在。
}
public static boolean myContains(String[] arr,String key)
{
for(int x=0;x<arr.length;x++)
{
if(arr[x].equals(key));
return true;
}
return false;
}
}
集合变数组:
Collection集合中的toArray方法。

1.指定类型的数组到底要定义多长呢?
        当指定类型的数组长度小于集合的size,该方法内部会创建一个新的数组,长度为集合的size.
        当指定类型的数组长度大于了集合的长度,就不会创建新的数组,而是使用传递进来的数组,如果传递的数字元素个数小于size,其余的位置会传入null.
        所以,创建一个刚刚好的数组最优。al.size()

2.为什么要将集合变数组?
        为了限定对元素的操作。
        将集合变成数组,就只能查看里面的元素,而不能添加和删除。(限定操作)。
public class Arrays_1 
{
public static void main(String[] args)
{
ArrayList<String> al=new ArrayList<String>();

al.add("abc1");
al.add("abc4");
al.add("abc5");
al.add("abc8");

String[] arr=al.toArray(new String[al.size()]);
System.out.println(Arrays.toString(arr));
}
}

2.Collections

Collections工具类的fill方法:将集合中的所有元素替换为指定的元素。

fill方法的局限性:全部替换;

将List集合中的部分元素替换成指定元素该怎么做?
三个参数:list,start,end.

public class Collections_0 
{
public static void main(String[] args)
{
sortDemo();
print("--------------");
maxDemo();
print("--------------");
binarySearchDemo();
print("--------------");

}
//打印:
public static void print(Object obj)
{
System.out.println(obj);
}
//排序:
public static void sortDemo()
{
List<String> list=new ArrayList<String>();

list.add("adfg");
list.add("ahhvg");
list.add("df");
list.add("cvv");
list.add("qq");
list.add("qq");//重复元素;

print(list);

//用集合框架的工具类进行排序;
//Collections.sort(list);//不能给Set集合排序;

Collections.sort(list,new StrLenComparator());//
print(list);
}
//获取最大值:
public static void maxDemo()
{
List<String> list=new ArrayList<String>();

list.add("adfg");
list.add("ahhvg");
list.add("df");
list.add("cvv");
list.add("qq");
list.add("qq");//重复元素;

String max=Collections.max(list);
//String max=Collections.max(list,new StrLenComparator());//最大长度的元素;

print("max:"+max);
}

//二分查找binarySearch:List集合,但凡是用到了binarySearch方法,一定是有序集合;
public static void binarySearchDemo()
{
List<String> list=new ArrayList<String>();

list.add("adfg");
list.add("ahhvg");
list.add("df");
list.add("cvxcvgfv");
list.add("qq");
list.add("qq");//重复元素;

Collections.sort(list,new StrLenComparator());//按照长度排序;
print(list);

//int index=Collections.binarySearch(list,"cvv");//二分查找;
//int index=halfSearch(list,"cfv");//验证返回的index值;
int index=halfSearch2(list,"cfv",new StrLenComparator());//当元素不具备比较性时,使用比较器;

System.out.println("index="+index);//如果要查找的元素不存在,则返回的index为:插入点索引-1;
}
//如果使用二分查找所要查找的元素不存在时返回的index原理
public static int halfSearch(List<String> list,String key)
{
int max,min,mid ;
max=list.size()-1;
min=0;

while(min<=max)
{
mid=(max+min)>>1;

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;
}
//当元素不具备比较性时,怎么做?
public static int halfSearch2(List<String> list,String key,Comparator<String> cmp)
{
int max,min,mid ;
max=list.size()-1;
min=0;

while(min<=max)
{
mid=(max+min)>>1;

String str=list.get(mid);

int num=cmp.compare(str, key);
if(num>0)
max=mid-1;
else if(num<0)
min=mid+1;
else
return mid;
}
return -min-1;
}
}
//定义一个比较器,使得将集合中的元素按照字符串长度排序:
class StrLenComparator implements Comparator<String>
{
@Override
public int compare(String s1, String s2)
{
if(s1.length()>s2.length())
return 1;
if(s1.length()<s2.length())
return -1;
return s1.compareTo(s2);
}
}