学习集合框架,Collections与Comparator是非常重要的工具,在一些集合操作中运用广泛,下面是简易讲解:
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;
}
}
然后创建一个测试类
扫描二维码关注公众号,回复:
14277485 查看本文章
![](/qrcode.jpg)
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);
}
}
可以看到集合是通过伤害大小排序的。
看懂以上的可以看看下面的例题