Collections与Comparator

学习集合框架,CollectionsComparator是非常重要的工具,在一些集合操作中运用广泛,下面是简易讲解:

Collections是一个,容器的工具类,就如同Arrays是数组的工具类。

Collections的常用方法:

reverse反转
shuffle混淆
sort排序
swap交换
rotate滚动
synchronizedList线程安全化

方法实现样例:

具体实现代码:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main {
public static void main(String[] args) {
	List<Integer> list =new ArrayList<Integer>();
	for(int i=0;i<10;i++) {
		list.add(i);
	}
	
	System.out.println("原始的集合:"+list);
	
	
	Collections.rotate(list, 2);
	System.out.println("往后滚动2个单位后的集合:"+list);
	
	Collections.shuffle(list);
	System.out.println("打乱顺序后的集合:"+list);
	
	Collections.sort(list);
	System.out.println("排序后的集合:"+list);
	
	Collections.reverse(list);
	System.out.println("反转后的集合:"+list);
	
	Collections.swap(list, 0, 1);
	System.out.println("将第一个位置和第二个位置交换后的集合:"+list);
	
	List<Integer> slist=(List<Integer>) Collections.synchronizedList(list);
	System.out.println("将list转化为线程安全的slist,list与slist的值相同");
	System.out.println(slist);
	
	
}
}

Comparator

假设Hero有三个属性 name,hp,damage
一个集合中放存放10个Hero,通过Collections.sort对这10个进行排序
那么到底是hp小的放前面?还是damage小的放前面?Collections.sort也无法确定
所以要指定到底按照哪种属性进行排序
这里就需要提供一个Comparator给定如何进行两个对象之间的大小比较。

我们批量生成一些Hero,随机的hp,damage,进行按damage排序:

我们先创建一个Hero类

public class Hero  {
    public String name;
    public float hp;
 
    public int damage;
 
    public Hero() {
 
    }
 
    public Hero(String name) {

        this.name = name;
    }
 
 	public String toString() {
		return "Hero [name=" + name + ", hp=" + hp + ", damage=" + damage + "]\r\n";
	}

	public Hero(String name, int hp, int damage) {
    	this.name = name;
    	this.hp = hp;
    	this.damage = damage;
	}
 
}

然后创建一个测试类

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Random;
   
import charactor.Hero;
    
public class TestCollection {
    public static void main(String[] args) {
        Random r =new Random();
        List<Hero> heros = new ArrayList<Hero>();
           
        for (int i = 0; i < 10; i++) {
            //通过随机值实例化hero的hp和damage
            heros.add(new Hero("hero "+ i, r.nextInt(100), r.nextInt(100)));
        }
        System.out.println("初始化后的集合:");
        System.out.println(heros);
           
        //直接调用sort会出现编译错误,因为Hero有各种属性
        //到底按照哪种属性进行比较,Collections也不知道,不确定,所以没法排
        //Collections.sort(heros);
           
        //引入Comparator,指定比较的算法
        Comparator<Hero> c = new Comparator<Hero>() {
            @Override
            public int compare(Hero h1, Hero h2) {
                //按照hp进行排序
                if(h1.hp>=h2.hp)
                    return 1;  //正数表示h1比h2要大
                else
                    return -1;
            }
        };
        Collections.sort(heros,c);
        System.out.println("按照血量排序后的集合:");
        System.out.println(heros);
    }
}

可以看到集合是通过伤害大小排序的。

看懂以上的可以看看下面的例题

传智杯-志愿者问题(Collections+Comparator完成)_无忧#的博客-CSDN博客

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无忧#

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值