###集合(3)###
1. 如何判断几何中是否包含某个元素
contains方法:
//contains方法
public void testListContains(){
//取得备选课程序列的第0个元素
Course course = coursesToSelect.get(0);
//打印输出coursesToSelected是否包含course对象
System.out.println("取得课程:"+course.getName());
System.out.println("备选课程中是否包含:"+course.getName()+","+
coursesToSelect.contains(course));
}
public static void main(String[] args) {
SetTest st = new SetTest();
st.testAdd();
st.testListContains();
}
public void testListContains(){
//取得备选课程序列的第0个元素
Course course = coursesToSelect.get(0);
//打印输出coursesToSelected是否包含course对象
System.out.println("取得课程:"+course.getName());
System.out.println("备选课程中是否包含:"+course.getName()+","+
coursesToSelect.contains(course));
//创建一个新的课程对象,ID和名称,与course对象一样
Course course2 = new Course(course.getId(),course.getName());
System.out.println("新创建课程:"+ course2.getName());
System.out.println("备选课程中是否包含:"+course2.getName()+","+
coursesToSelect.contains(course2));
}
public static void main(String[] args) {
SetTest st = new SetTest();
st.testAdd();
st.testListContains();
}
虽然两个course内容ID一样 但是还是为同一个对象,所以第二次为false。
contains详细图解:
例:此时增加方法:
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (!(obj instanceof Course)) {
return false;
}
Course course = (Course) obj;
if (this.getName() == null) {
if (course.getName() == null) {
return true;
} else {
return false;
}
} else {
if (this.getName().equals(course.name)) {
return true;
}else {
return false;
}
}
}
public static void main(String[] args) {
SetTest st = new SetTest();
st.testAdd();
st.testListContains();
}
此时可以看到course2中也显示true了。
例:重新加入Scanner键盘录入查询后:
public class SetTest {
public List<Course> coursesToSelect;
private Scanner console;
public SetTest() {
coursesToSelect = new ArrayList<Course>();
console = new Scanner(System.in);
}
//contains方法
public void testListContains(){
//取得备选课程序列的第0个元素
Course course = coursesToSelect.get(0);
//打印输出coursesToSelected是否包含course对象
System.out.println("取得课程:"+course.getName());
System.out.println("备选课程中是否包含:"+course.getName()+","+
coursesToSelect.contains(course));
//提示输入课程名称
System.out.println("请输入课程名称:");
String name = console.next();
//创建一个新的课程对象,ID和名称,与course对象一样
Course course2 = new Course();
course2.setName(name);
System.out.println("新创建课程:"+ course2.getName());
System.out.println("备选课程中是否包含:"+course2.getName()+","+
coursesToSelect.contains(course2));
}
public static void main(String[] args) {
SetTest st = new SetTest();
st.testAdd();
st.testListContains();
}
2. Set中判断是否存在
Conllection:
Set:contains、containsAll
import java.util.Objects;
public class Course {
private String id;
private String name;
public Course(String id, String name) {
this.id = id;
this.name = name;
}
public Course() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int hashCode() {
return Objects.hash(name);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (!(obj instanceof Course)) {
return false;
}
Course course = (Course) obj;
if (this.getName() == null) {
if (course.getName() == null) {
return true;
} else {
return false;
}
} else {
if (this.getName().equals(course.name)) {
return true;
}else {
return false;
}
}
}
}
//创建学生对象并选课
public void createStuAndSelC(){
//创建学生对象
student = new Student("1","小明");
System.out.println("欢迎"+student.getName()+"进入选课系统");
//接收从键盘输入的课程ID
Scanner sc = new Scanner(System.in);
for (int i = 0; i<3;i++){
System.out.println("请输入要选课程ID");
String cId = sc.next();
for(Course cr : coursesToSelect){
if(cr.getId().equals(cId)){
student.course.add(cr);
}
}
}
}
public void testSetContains(){
//提示输入课程名称
System.out.println("请输入学生已选的课程名称:");
String name = console.next();
Course course2 = new Course();
course2.setName(name);
System.out.println("新创建课程:"+ course2.getName());
System.out.println("备选课程中是否包含:"+course2.getName()+","+
student.course.contains(course2));
}
public static void main(String[] args) {
SetTest st = new SetTest();
st.testAdd();
st.testForEach();
st.createStuAndSelC();
st.testSetContains();
}
3. 获取List中的课程的位置:indexOf方法来取得某元素的索引位置
//contains方法
public void testListContains() {
//取得备选课程序列的第0个元素
Course course = coursesToSelect.get(0);
//打印输出coursesToSelected是否包含course对象
System.out.println("取得课程:" + course.getName());
System.out.println("备选课程中是否包含:" + course.getName() + "," +
coursesToSelect.contains(course));
//提示输入课程名称
System.out.println("请输入课程名称:");
String name = console.next();
//创建一个新的课程对象,ID和名称,与course对象一样
Course course2 = new Course();
course2.setName(name);
System.out.println("新创建课程:" + course2.getName());
System.out.println("备选课程中是否包含:" + course2.getName() + "," +
coursesToSelect.contains(course2));
//通过indexOf方法来取得某元素的索引位置
if (coursesToSelect.contains(course2)) {
System.out.println("课程:" + course2.getName() + "的索引位置为:"
+ coursesToSelect.indexOf(course2));
}
}
public static void main(String[] args) {
SetTest st = new SetTest();
st.testAdd();
st.testListContains();
st.testForEach();
//st.testForEachForSet(student);
//st.createStuAndSelC();
//st.testSetContains();
}
4. 判断Map中是否包含指定的key和value
1)通过Key查找
public class MapTest {
public Map<String, Student> students;
public MapTest() {
this.students = new HashMap<String, Student>();
}
public void testKeySet() {
//通过keySet方法,返回Map中的所有“键”的Set集合
Set<String> keySet = students.keySet();
//取得students的容量
System.out.println("共有:" + students.size() + "个学生");
for (String sID : keySet) {
Student st = students.get(sID);
if (st != null) {
System.out.println("学生:" + st.getName());
}
}
}
public void testPut() {
Scanner sc = new Scanner(System.in);
int i = 0;
while (i < 3) {
System.out.println("请输入学生ID:");
String ID = sc.next();
Student st = students.get(ID);
if (st == null) {
System.out.println("请输入学生姓名:");
String name = sc.next();
Student nSt = new Student(ID, name);
students.put(ID, nSt);
System.out.println("成功添加:" + students.get(ID).getName());
i++;
} else {
System.out.println("学生ID被占用");
continue;
}
}
}
//删除测试
public void testRemove() {
System.out.println("请输入要删除的学生ID:");
while(true){
Scanner sc = new Scanner(System.in);
String ID = sc.next();
Student st = students.get(ID);
if (st == null){
System.out.println("您输入的ID不存在");
continue;
}
students.remove(ID);
System.out.println("成功删除学生"+st.getName());
break;
}
}
//通过entrySet来遍历Map
public void testEntrySet(){
Set<Map.Entry<String,Student>> entrySet = students.entrySet();
for (Map.Entry<String,Student> entry : entrySet){
System.out.println("取得键:"+entry.getKey());
System.out.println("对应的学生为:"+entry.getValue().getName());
}
}
//利用put方法修改Map中的已有映射
public void testModify(){
System.out.println("请输入要修改的学生ID");
Scanner sc = new Scanner(System.in);
while(true){
String stuID = sc.next();
//查找是否又相应的映射
Student student = students.get(stuID);
if(student ==null){
System.out.println("学生ID不存在,请重新输入");
continue;
}
System.out.println("该学生ID,所对应的学生为:"+student.getName());
System.out.println("请输入新的学生姓名");
String name = sc.next();
Student nStu =new Student(stuID,name);
students.put(stuID,nStu);
System.out.println("修改成功!");
break;
}
}
//测试Map中,是否包含某个Key值或者某个Value值
public void testContainKorV(){
//提示输入学生ID
System.out.println("请输入学生ID:");
Scanner sc = new Scanner(System.in);
String id = sc.next();
//在Map中,用containsKey()方法,来判断是否包含某个Key值
System.out.println("您输入的学生ID为:"+id+",在学生映射表中是否存在:"+
students.containsKey(id));
if(students.containsKey(id)){
System.out.println("对应的学生为:"+students.get(id).getName());
}
//用containsValue()方法,来判断是否包含某个Value值
}
}
public static void main(String[] args) {
MapTest mt = new MapTest();
mt.testPut();
mt.testKeySet();
mt.testContainKorV();
}
2)通过Value查找
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
public class Student {
private String id;
private String name;
public Set<Course> course;
public Student() {
}
public Student(String id, String name) {
this.id = id;
this.name = name;
this.course = new HashSet<Course>();
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
}
//测试Map中,是否包含某个Key值或者某个Value值
public void testContainKorV(){
//提示输入学生ID
System.out.println("请输入学生ID:");
Scanner sc = new Scanner(System.in);
String id = sc.next();
//在Map中,用containsKey()方法,来判断是否包含某个Key值
System.out.println("您输入的学生ID为:"+id+",在学生映射表中是否存在:"+
students.containsKey(id));
if(students.containsKey(id)){
System.out.println("对应的学生为:"+students.get(id).getName());
}
System.out.println("请输入要查询的学生姓名:");
String name = sc.next();
//用containsValue()方法,来判断是否包含某个Value值
if(students.containsValue(new Student(null,name))){
System.out.println("在学生映射表中,确实包含学生:"+name);
}else{
System.out.println("在学生映射表中不存在该学生");
}
}
public static void main(String[] args) {
MapTest mt = new MapTest();
mt.testPut();
mt.testKeySet();
mt.testContainKorV();
}
5. Collection.sort{}实现list排序:是Java集合框架中,用来操作集合对象的工具类,同时也是Java集合框架的成员
sout()(排序)方法:
例1:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class CollectionsTest {
public void testSort1(){
List<Integer> integerList = new ArrayList<Integer>();
//不能使用基本类型作为泛型
//插入是个100以内的不重复随机整数
Random random = new Random();
Integer k;
for(int i =0;i<10;i++){
do{
k = random.nextInt(100);
}while (integerList.contains(k));
integerList.add(k);
System.out.println("成功添加整数:"+k);
}
System.out.println("---------排序前--------");
for (Integer integer:integerList) {
System.out.println("元素:"+integer);
}
Collections.sort(integerList);
System.out.println("---------排序后--------");
for (Integer integer:integerList) {
System.out.println("元素:"+integer);
}
}
}
public static void main(String[] args) {
CollectionsTest ct = new CollectionsTest();
ct.testSort1();
}
例2:
//对String泛型的List进行排序
public void testSort2(){
List<String> stringList = new ArrayList<String>();
stringList.add("Silvia");
stringList.add("Angelababy");
stringList.add("Emma");
System.out.println("---------排序前-------");
for (String string:stringList){
System.out.println("元素:"+string);
}
Collections.sort(stringList);
System.out.println("---------排序后-------");
for (String string:stringList){
System.out.println("元素:"+string);
}
}
public static void main(String[] args) {
CollectionsTest ct = new CollectionsTest();
//ct.testSort1();
ct.testSort2();
}
补:尝试用对其他泛型的List进行排序
//对其他类型的泛型的List进行排序
public void testSort3() {
List<Student> studentList = new ArrayList<Student>();
studentList.add(new Student(1+"","梦竹"));
studentList.add(new Student(2+"","帜琦"));
studentList.add(new Student(3+"","杨颖"));
System.out.println("---------排序前-------");
for (Student student:studentList) {
System.out.println("学生:"+student.getName());
}
Collections.sort(studentList);
}
6. Comparable 与 Comparator
1)Comparable接口:对于Object1 与 Object2 进行比较---必须有可比较的属性,此时Comparable给予对象比较规则。
实现该接口表示:这个类的实例可以比较大小,可以进行自然排序
定义了默认的比较规则
其实现类需实现comparaTo()方法
comparaTo()方法返回正数表示大,负数表示小,0表示相等
2)Comparetor接口:定义临时的比较规则
用于定义临时比较规则,而不是默认比较规则
其实现类需要实现compara()方法
Comparator 和 Comparable 都是Java集合框架成员
例:
1)自然排序
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
public class Student implements Comparable<Student>{
private String id;
private String name;
public Set<Course> course;
public Student() {
}
public Student(String id, String name) {
this.id = id;
this.name = name;
this.course = new HashSet<Course>();
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
@Override
public int compareTo(Student o) {
return this.id.compareTo(o.id);
}
}
//对其他类型的泛型的List进行排序
public void testSort3() {
List<Student> studentList = new ArrayList<Student>();
Random random = new Random();
studentList.add(new Student(random.nextInt(100)+"","AndrewL"));
studentList.add(new Student(random.nextInt(100)+"","Silvia"));
studentList.add(new Student(random.nextInt(100)+"","Angelababy"));
System.out.println("---------排序前-------");
for (Student student:studentList) {
System.out.println("学生:"+student.getId()+student.getName());
}
Collections.sort(studentList);
System.out.println("---------排序后-------");
for (Student student:studentList) {
System.out.println("学生:"+student.getId()+student.getName());
}
}
public static void main(String[] args) {
CollectionsTest ct = new CollectionsTest();
ct.testSort3();
}
排序方式:
2)比较排序
ps:可以将Comparator传递给sort方法(如Collections.sort 或 Arrays.sort)
import java.util.Comparator;
public class StudentComparator implements Comparator<Student> {
@Override
public int compare(Student o1, Student o2) {
return o1.getName().compareTo(o2.getName());
}
}
//对其他类型的泛型的List进行排序
public void testSort3() {
List<Student> studentList = new ArrayList<Student>();
Random random = new Random();
studentList.add(new Student(random.nextInt(100)+"","AndrewL"));
studentList.add(new Student(random.nextInt(100)+"","Silvia"));
studentList.add(new Student(random.nextInt(100)+"","Angelababy"));
System.out.println("---------排序前-------");
for (Student student:studentList) {
System.out.println("学生:"+student.getId()+student.getName());
}
Collections.sort(studentList);
System.out.println("---------排序后-------");
for (Student student:studentList) {
System.out.println("学生:"+student.getId()+student.getName());
}
Collections.sort(studentList,new StudentComparator());
System.out.println("--------姓名排序------");
for (Student student:studentList) {
System.out.println("学生:"+student.getId()+student.getName());
}
}
public static void main(String[] args) {
CollectionsTest ct = new CollectionsTest();
ct.testSort3();
}
总结:
7. 例题简易扑克牌游戏
package ddz;
import java.util.ArrayList;
import java.util.Collections;
public class 斗地主 {
public static void main(String[] args) {
//创建牌盒子
ArrayList<String> pokerList = new ArrayList<>();
//生成54张牌放进牌盒子中
String[] colors = {"♥", "♠", "♣", "♦"};
String[] nums = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
for (String color : colors) {
for (String num : nums) {
pokerList.add(color.concat(num));
}
}
//手动添加大小王
pokerList.add("☀");
pokerList.add("