1. 可变参数
在 JDK1.5 之后,如果咱们定义一个办法须要承受多个参数,并且多个参数类型统一,咱们能够对其简化.
格局:
修饰符 返回值类型 办法名(参数类型... 形参名){}
底层:
其实就是一个数组
益处:
在传递数据的时候,省的咱们本人创立数组并增加元素了,JDK 底层帮咱们主动创立数组并增加元素了
代码演示:
public class ChangeArgs {public static void main(String[] args) {int sum = getSum(6, 7, 2, 12, 2121);
System.out.println(sum);
}
public static int getSum(int... arr) {
int sum = 0;
for (int a : arr) {sum += a;}
return sum;
}
}
留神:
1. 一个办法只能有一个可变参数
2. 如果办法中有多个参数,可变参数要放到最初。
利用场景: Collections
在 Collections 中也提供了增加一些元素办法:
public static <T> boolean addAll(Collection<T> c, T... elements)
: 往汇合中增加一些元素。
代码演示:
public class CollectionsDemo {public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<Integer>();
// 原来写法
//list.add(12);
//list.add(14);
//list.add(15);
//list.add(1000);
// 采纳工具类 实现 往汇合中增加元素
Collections.addAll(list, 5, 222, 1,2);
System.out.println(list);
}
2. Collections 类
2.1 Collections 罕用性能
-
java.utils.Collections
是汇合工具类,用来对汇合进行操作。罕用办法如下:
public static void shuffle(List<?> list)
: 打乱汇合程序。public static <T> void sort(List<T> list)
: 将汇合中元素依照默认规定排序。public static <T> void sort(List<T> list,Comparator<? super T>)
: 将汇合中元素依照指定规定排序。
代码演示:
public class CollectionsDemo {public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<Integer>();
list.add(100);
list.add(300);
list.add(200);
list.add(50);
// 排序办法
Collections.sort(list);
System.out.println(list);
}
}
后果:[50,100, 200, 300]
咱们的汇合依照默认的天然程序进行了排列,如果想要指定程序那该怎么办呢?
2.2 Comparator 比拟器
创立一个学生类,存储到 ArrayList 汇合中实现指定排序操作。
Student 类
public class Student{
private String name;
private int age;
// 构造方法
//get/set
//toString
}
测试类:
public class Demo {public static void main(String[] args) {
// 创立四个学生对象 存储到汇合中
ArrayList<Student> list = new ArrayList<Student>();
list.add(new Student("rose",18));
list.add(new Student("jack",16));
list.add(new Student("abc",20));
Collections.sort(list, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {return o1.getAge()-o2.getAge();// 以学生的年龄升序}
});
for (Student student : list) {System.out.println(student);
}
}
}
Student{name='jack', age=16}
Student{name='rose', age=18}
Student{name='abc', age=20}
3. 综合练习
练习 1:随机点名器
需要:班级里有 N 个学生,实现随机点名器
代码实现:
public class Test1 {public static void main(String[] args) {
/* 班级里有 N 个学生,学生属性: 姓名,年龄,性别。实现随机点名器。*/
//1. 定义汇合
ArrayList<String> list = new ArrayList<>();
//2. 增加数据
Collections.addAll(list,"范闲","范建","范统","杜子腾","杜琦燕","宋合泛","侯笼藤","朱益群","朱穆朗玛峰","袁明媛");
//3. 随机点名
/* Random r = new Random();
int index = r.nextInt(list.size());
String name = list.get(index);
System.out.println(name);*/
// 打乱
Collections.shuffle(list);
String name = list.get(0);
System.out.println(name);
}
}
练习 2:带概率的随机
需要:
班级里有 N 个学生
要求在随机的时候,70% 的概率随机到男生,30% 的概率随机到女生
代码实现:
public class Test2 {public static void main(String[] args) {
/* 班级里有 N 个学生
要求:70% 的概率随机到男生
30% 的概率随机到女生
"范闲","范建","范统","杜子腾","宋合泛","侯笼藤","朱益群","朱穆朗玛峰",
"杜琦燕","袁明媛","李猜","田蜜蜜",
*/
//1. 创立汇合
ArrayList<Integer> list = new ArrayList<>();
//2. 增加数据
Collections.addAll(list,1,1,1,1,1,1,1);
Collections.addAll(list,0,0,0);
//3. 打乱汇合中的数据
Collections.shuffle(list);
//4. 从 list 汇合中随机抽取 0 或者 1
Random r = new Random();
int index = r.nextInt(list.size());
int number = list.get(index);
System.out.println(number);
//5. 创立两个汇合别离存储男生和女生的名字
ArrayList<String> boyList = new ArrayList<>();
ArrayList<String> girlList = new ArrayList<>();
Collections.addAll(boyList,"范闲","范建","范统","杜子腾","宋合泛","侯笼藤","朱益群","朱穆朗玛峰");
Collections.addAll(girlList,"杜琦燕","袁明媛","李猜","田蜜蜜");
//6. 判断此时是从 boyList 外面抽取还是从 girlList 外面抽取
if(number == 1){
//boyList
int boyIndex = r.nextInt(boyList.size());
String name = boyList.get(boyIndex);
System.out.println(name);
}else{
//girlList
int girlIndex = r.nextInt(girlList.size());
String name = girlList.get(girlIndex);
System.out.println(name);
}
}
}
练习 3:随机不反复
需要:
班级里有 N 个学生,被点到的学生不会再被点到。然而如果班级中所有的学生都点完了,须要从新开启第二轮点名。
代码实现:
public class Test3 {public static void main(String[] args) {
/* 班级里有 5 个学生
要求:被点到的学生不会再被点到。然而如果班级中所有的学生都点完了,须要从新开启第二轮点名。*/
//1. 定义汇合
ArrayList<String> list1 = new ArrayList<>();
//2. 增加数据
Collections.addAll(list1, "范闲", "范建", "范统", "杜子腾", "杜琦燕", "宋合泛", "侯笼藤", "朱益群", "朱穆朗玛峰", "袁明媛");
// 创立一个长期的汇合,用来存曾经被点到学生的名字
ArrayList<String> list2 = new ArrayList<>();
// 外循环:示意轮数
for (int i = 1; i <= 10; i++) {System.out.println("========= 第" + i + "轮点名开始了 ======================");
//3. 获取汇合的长度
int count = list1.size();
//4. 随机点名
Random r = new Random();
// 内循环:每一轮中随机循环抽取的过程
for (int j = 0; j < count; j++) {int index = r.nextInt(list1.size());
String name = list1.remove(index);
list2.add(name);
System.out.println(name);
}
// 此时示意一轮点名完结
//list1 空了 list2 10 个学生的名字
list1.addAll(list2);
list2.clear();}
}
}
练习 4:汇合的嵌套
需要:
定义一个 Map 汇合,键用示意省份名称 province,值示意市 city,然而市会有多个。
增加结束后,遍历后果格局如下:
江苏省 = 南京市,扬州市,苏州市,无锡市,常州市
湖北省 = 武汉市,孝感市,十堰市,宜昌市,鄂州市
河北省 = 石家庄市,唐山市,邢台市,保定市,张家口市
代码实现:
public class Test4 {public static void main(String[] args) {
/* 需要
定义一个 Map 汇合,键用示意省份名称 province,值示意市 city,然而市会有多个。增加结束后,遍历后果格局如下:江苏省 = 南京市,扬州市,苏州市,无锡市,常州市
湖北省 = 武汉市,孝感市,十堰市,宜昌市,鄂州市
河北省 = 石家庄市,唐山市,邢台市,保定市,张家口市 */
//1. 创立 Map 汇合
HashMap<String, ArrayList<String>> hm = new HashMap<>();
//2. 创立单列汇合存储市
ArrayList<String> city1 = new ArrayList<>();
city1.add("南京市");
city1.add("扬州市");
city1.add("苏州市");
city1.add("无锡市");
city1.add("常州市");
ArrayList<String> city2 = new ArrayList<>();
city2.add("武汉市");
city2.add("孝感市");
city2.add("十堰市");
city2.add("宜昌市");
city2.add("鄂州市");
ArrayList<String> city3 = new ArrayList<>();
city3.add("石家庄市");
city3.add("唐山市");
city3.add("邢台市");
city3.add("保定市");
city3.add("张家口市");
//3. 把省份和多个市增加到 map 汇合
hm.put("江苏省",city1);
hm.put("湖北省",city2);
hm.put("河北省",city3);
Set<Map.Entry<String, ArrayList<String>>> entries = hm.entrySet();
for (Map.Entry<String, ArrayList<String>> entry : entries) {
//entry 顺次示意每一个键值对对象
String key = entry.getKey();
ArrayList<String> value = entry.getValue();
StringJoiner sj = new StringJoiner(",","","");
for (String city : value) {sj.add(city);
}
System.out.println(key + "=" + sj);
}
}
}