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博客

猜你喜欢

转载自blog.csdn.net/weixin_52473454/article/details/121458365
今日推荐