java笔记19 Collections和Arrays

1.      Collections工具类

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]  变成了二维数组
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值