Java集合整理之集合工具类---Collections

一、集合工具类---Collections

        集合框架提供了一个工具类,Collections,此类型中封装了很多对集合操作的方法,比如排序,查询,修改等。

        想要使用排序功能,必须实现一个接口,Comparable或者Comparator接口。

二、Collections的使用

    (1)排序,sort()方法。sort()是一个静态方法,可以对指定集合进行排序,可以自定义排序规则,默认为自然排序(升序)。

List<Character> chs = new ArrayList<Character>();
//随机10个字符添加进集合中
for(int i=0;i<10;i++) {
	int num = (int)(Math.random()*26);
	chs.add((char)(num+65));
}
System.out.println(chs);
//调用工具类中的sort方法,进行自然排序(升序)
/*
 * void sort(List<T> list)
 */
Collections.sort(chs);
System.out.println(chs);

        输出结果:

        

    这只是对一些自然的元素进行排序,当集合元素是一个类时,再使用这样的方式进行排序,就得不到想要的结果了。

    创建一个Point类,提供构造器,get/set方法并重写toString()方法。

public class Point {
	private int x;
	private int y;
	
	public Point() {}
	public Point(int x, int y) {
		super();
		this.x = x;
		this.y = y;
	}
	public int getX() {
		return x;
	}
	public void setX(int x) {
		this.x = x;
	}
	public int getY() {
		return y;
	}
	public void setY(int y) {
		this.y = y;
	}
	@Override
	public String toString() {
		return "("+x+","+y+")";
	}
}

    此时如果想对类进行排序,则类必须要实现一个接口,不然编译器会报错。

    让Point类实现Comparable<T>接口,并重写comparaTo()方法。

public class Point implements Comparable<Point>{

        ......

	@Override
	public int compareTo(Point o) {
		return this.x-o.x;
	}
}

    comparaTo()方法,是排序的规则,返回值是int类型的值,作用是将类中的元素两两比较,如果当前对象的属性值-给定对象的属性值>0的话,则当前元素往后移,反之,则向前移,若相等,则不进行移动。

    在这里,是按照 x 的值进行升序排序,所以直接 return this.x-o.x; 就可以了。

    创建3个实例,添加到集合list中,并调用sort进行排序。

public static void main(String[] args) {
	Point  p1 = new Point(1,3);
	Point  p2 = new Point(5,4);
	Point  p3 = new Point(2,2);
	
	List<Point> list = new ArrayList<Point>();
	list.add(p1);
	list.add(p2);
	list.add(p3);
	
	System.out.println("排序前:"+list);
	Collections.sort(list);
	System.out.println("排序后:"+list);
}

        输出结果:

        

    如果想要降序排序,只需要修改comparaTo()方法的返回值为 return o.x-this.x; 即可。

@Override
public int compareTo(Point o) {
	return o.x-this.x;
}

        输出结果:

        

    使用这种方式进行排序,需要在创建类时就写好对应的方法,在大多数时候,可能只是临时使用排序功能,在这种情况下,可以使用比较器,Comparator<T>,因为只需要使用一次,所以这里用匿名内部类的形式来调用,这个接口需要重写compara()方法,排序规则和comparaTo()类似。

Collections.sort(list, new Comparator<Point>() {
	@Override
	public int compare(Point o1, Point o2) {
		return o1.getX()-o2.getX();
	}	
});

    输出一下排序前后的结果。

        输出结果:

        

    (2)反转集合,reverse()方法,反转指定集合中的元素。

    创建一个新的集合,并赋值。

List<String> list = new ArrayList<String>();
for(char i='A';i<='G';i++) {
	list.add(i+"");
}
/*
 * 如果自定义的类型作为元素添加到集合中,
 * 那么类型需要重写toString()才能正常输出元素,否则将输出元素的地址信息
 */
System.out.println(list);

        输出结果:

        

    调用reverse()方法。

/*
 * 工具类的 void reverse(List list);
 * 静态方法。
 */	
Collections.reverse(list);
System.out.println(list);

        输出结果:

        

    (3)随机排序,shuffle()方法,对集合中的元素进行随机排序(混洗)。

/*
 * shuffle(List list):
 * 对集合元素进行随机排序(混洗)
 */
Collections.shuffle(list);
System.out.println(list);

        输出结果:

        

    (4)交换元素,swap()方法,交换集合中指定索引的两个元素。

/*
 * 将第二个元素与最后一个元素进行交换
 * void swap(list,index1,index2)
 */
Collections.swap(list, 1, list.size()-1);
System.out.println(list);

        输出结果:

        

    (5)寻找最大值,max()方法,使用自然排序,找到元素中的最大值,并不会影响到原集合中的元素。

/*
 *  Object max(list):使用自然排序,找到最大值
 */
String max = Collections.max(list);
System.out.println(max);

        输出结果:

        

    (6)寻找最小值,min()方法,同max类似,找到元素中的最小值。

/*
 * 找到集合中的最小值
 * Object min(list)
 */
String min = Collections.min(list);
System.out.println(min);

        输出结果:

        

    (7)查看元素出现次数,frequency()方法,返回指定元素在集合中出现的次数。

/*
 * int frequency(list,obj);
 * 返回obj在list集合中出现的次数。
 */
int count = Collections.frequency(list, "G");
System.out.println(count);

        输出结果:

        

    (8)替换元素,replaceAll(),使用新值替换旧值。

/*
 * 使用新值替换旧值
 * boolean replaceAll(List list,Object oldVal,Object newVal)
 */
boolean flag = Collections.replaceAll(list, "G", "H");
System.out.println("flag:"+flag);
System.out.println(list);

        输出结果:

        

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值