A:Set集合概述及特色java
B:案例演示算法
import java.util.HashSet; public class Demo1_HashSet { public static void main(String[] args) { //Set集合,无索引,不能够重复,无序(存取不一致) HashSet<String> hs = new HashSet<>(); //建立HashSet对象 boolean b1 = hs.add("a"); boolean b2 = hs.add("a"); //当向Set集合中储存重复元素的时候返回为false hs.add("b"); hs.add("c"); hs.add("d"); System.out.println(hs); //HashSet的继承体现中有重写toString方法 System.out.println(b1); System.out.println(b2); for (String string : hs) { //只要能用迭代器迭代的,就可使用加强for循环遍历 System.out.println(string); } } }
A:案例演示数组
B:画图演示dom
C:代码优化ide
最终版就是自动生成便可。函数
D:原理优化
1.HashSet原理ui
当HashSet调用add()方法存储对象的时候, 先调用对象的hashCode()方法获得一个哈希值(如同上火车先有票), 而后在集合中查找是否有哈希值相同的对象this
2.将自定义类的对象存入HashSet去重复idea
import java.util.HashSet; import net.allidea.bean.Person; public class Demo1_HashSet { public static void main(String[] args) { HashSet<Person> hs = new HashSet<>(); hs.add(new Person("张三",23)); hs.add(new Person("张三",23)); hs.add(new Person("李四",24)); hs.add(new Person("李四",24)); hs.add(new Person("李四",24)); // System.out.println(hs.size()); System.out.println(hs); } }
//Person文件 public class Person { private String name; private int age; public Person() { super(); } public Person(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } //为何是31? 1.是质数。2.既不大也不小。3.是2的五次方-1,2向左移动五位 @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + age; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) //调用的对象和传入的对象是同一个对象 return true; if (obj == null) //传入的对象为NULL return false; if (getClass() != obj.getClass()) //判断两个对象对应的字节码文件是不是同一个字节码 return false; Person other = (Person) obj; //向下转型 if (age != other.age) //调用对象的年龄不等于传入对象的年龄 return false; if (name == null) { //调用对象的姓名为null if (other.name != null) return false; } else if (!name.equals(other.name)) //调用对象的姓名不等于传入对象的姓名 return false; return true; } /* @Override public boolean equals(Object obj) { System.out.println("执行了吗"); Person p = (Person)obj; return this.name.equals(p.name) && this.age == p.age; } @Override public int hashCode() { //return 10; //return age; final int NUM = 38; return name.hashCode() * NUM + age; }*/ }
B:LinkedHashSet的特色
1.底层是链表实现的,是Set集合中惟一一个能保证怎么存就怎么取的集合对象
import java.util.LinkedHashSet; public class Demo2_LinkedHashSet { public static void main(String[] args) { LinkedHashSet<String> lhs = new LinkedHashSet<>(); lhs.add("a"); lhs.add("a"); lhs.add("a"); lhs.add("b"); lhs.add("c"); lhs.add("d"); System.out.println(lhs); } }
A:案例演示
import java.util.HashSet; import java.util.Random; public class Demo3_test { public static void main(String[] args) { Random r = new Random(); //1.建立Random随机数对象 HashSet<Integer> hs = new HashSet<>(); //2.须要存储10个随机数,不能重复,用HashSet集合 while(hs.size() < 10) { //3.若是HashSet的size<10就能够不断的存储,若是>=10就中止存储 hs.add(r.nextInt(20) + 1); //4.经过Random类中的nextInt(n)方法,获取1-20之间的随机数, } //并将这些随机数存储在HashSet集合中 for (Integer integer : hs) { //5.遍历HashSet System.out.println(integer); } } }
import java.util.HashSet; import java.util.Scanner; public class Demo2 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); //1.建立Scanner对象 System.out.println("请输入一行字符串:"); HashSet<Character> hs = new HashSet<>(); //2.建立HashSet对象,将字符存储去掉重复 String line = sc.nextLine(); char[] arr = line.toCharArray(); //3.将字符串转换为字符数组,获取每个字符存储在HashSet集合中,自动去除重复 for (char c : arr) { //4.遍历字符数组 hs.add(c); } for(Character ch : hs) { //5.自动拆箱,遍历HashSet,打印每个字符 System.out.println(ch); } } }
import java.util.List; import java.util.ArrayList; import java.util.LinkedHashSet; public class Demo3 { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>();//1.建立List集合存储若干个重复元素 list.add("a"); list.add("a"); list.add("b"); list.add("b"); list.add("b"); list.add("c"); getSingle(list); //2.单独定义方法去除重复 System.out.println(list); //3.打印List集合 } public static void getSingle(List<String> list) { LinkedHashSet<String> lhs = new LinkedHashSet<>(); //1.建立一个LinkedHashSet集合 lhs.addAll(list); //2.将List集合中全部的元素添加到LinkedHashSet集合中,去重 list.clear(); //3.将List集合中的元素清空。 list.addAll(lhs); //4.将LinkedHashSet集合中的元素添加回List集合中 } }
A:案例演示
TreeSet存储Integer类型的元素并遍历
import java.util.TreeSet; public class Demo3_TreeSet { public static void main(String[] args) { TreeSet<Integer> ts = new TreeSet<>(); ts.add(1); ts.add(1); ts.add(3); ts.add(3); ts.add(2); System.out.println(ts); } }
A:案例演示
存储自定义Person对象
B:TreeSet保证元素惟一和天然排序的原理和图解
原理
import java.util.TreeSet; import net.allidea.bean.Person; public class Demo3_TreeSet { public static void main(String[] args) { TreeSet<Person> ts = new TreeSet<>(); ts.add(new Person("张三",23)); ts.add(new Person("李四",24)); ts.add(new Person("李二",24)); ts.add(new Person("王五",25)); ts.add(new Person("赵六",46)); ts.add(new Person("田七",17)); System.out.println(ts); } private static void demo1() { TreeSet<Integer> ts = new TreeSet<>(); ts.add(1); ts.add(1); ts.add(3); ts.add(3); ts.add(2); System.out.println(ts); } }
//重写Person文件中的compareTo @Override public int compareTo(Person o) { int num = this.age - o.age; //年龄是比较的主要条件,姓名是次要条件 return num == 0 ? this.name.compareTo(o.name) : num; }
A:案例演示
@Override //按照姓名排序 public int compareTo(Person o) { int num = this.name.compareTo(o.name); return num == 0 ? this.age - o.age : num; }
A:案例演示
@Override //按照姓名长度排序 public int compareTo(Person o) { int length = this.name.length() - o.name.length(); //比较长度为主要条件 int num = length == 0 ? this.name.compareTo(o.name) : length; //比较内容为次要条件 return num == 0 ? this.age - o.age : num; //比较年龄为次要条件 }
A:案例演示
public static void main(String[] args) { //将字符串按照长度排序 //Comparator c = new CompareBylen();父类指向子类 TreeSet<String> ts = new TreeSet<>(new CompareByLen()); ts.add("aaaaa"); ts.add("z"); ts.add("wc"); ts.add("nab"); ts.add("cba"); System.out.println(ts); }
//比较器 class CompareByLen /*extends Object*/ implements Comparator<String> { @Override public int compare(String s1, String s2) { //按照字符串长度比较 int num = s1.length() - s2.length(); //长度为主要条件 return num == 0 ? s1.compareTo(s2) : num;//内容为次要条件 } }
1.特色
2.使用方式
a.天然顺序(Comparable)
b.比较器顺序(Comparator)
c.两种方式的区别
A:匿名内部类
B:前提:存在一个类或者接口
C:格式:
new 接口名(){重写方法;}
D:本质是什么呢?
import java.util.List; import java.util.TreeSet; import java.util.ArrayList; import java.util.Comparator; public class Demo4 { public static void main(String[] args) { //1.定义一个List集合,并存储重复的无序的字符串 ArrayList<String> list = new ArrayList<>(); list.add("aaaa"); list.add("g"); list.add("bb"); list.add("all"); list.add("ccc"); list.add("idea"); list.add("bb"); list.add("aaaa"); sort(list); //2.定义方法对其排序保留重复 System.out.println(list); //3.打印List集合 } private static void sort(List<String> list) { //1.建立TreeSet集合对象,由于String自己就具有比较功能,可是重复不会保留,因此咱们用比较器 TreeSet<String> ts = new TreeSet<>(new Comparator<String>() { //匿名内部类的方法 @Override public int compare(String s1, String s2) { int num = s1.compareTo(s2); //比较内容 return num == 0 ? 1 : num; }}); //2.将List集合中全部的元素添加到TreeSet集合中,对其排序,保留重复 ts.addAll(list); //3.清空list集合 list.clear(); //4.将TreeSet集合中排好序的元素添加到list中 list.addAll(ts); } }
import java.util.Comparator; import java.util.Scanner; import java.util.TreeSet; public class Demo5 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入一个字符串:"); String line = sc.nextLine(); //2.将字符串转换为字符数组 char[] arr = line.toCharArray(); //3.定义TreeSet集合,传入比较器对字符排序,并保留重复 TreeSet<Character> ts = new TreeSet<>(new Comparator<Character>() { @Override public int compare(Character c1, Character c2) { // int num = c1 - c2; //自动拆箱 int num = c1.compareTo(c2); return num == 0 ? 1 : num; }}); //4.遍历字符数组,将每个字符存储在TreeSet集合中 for (char c : arr) { ts.add(c); //自动装箱 } //5.遍历TreeSet打印每个字符 for(Character c : ts) { System.out.print(c); } } }
import java.util.Comparator; import java.util.Scanner; import java.util.TreeSet; public class Demo6 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); //1.建立Scanner对象,键盘录入。 //2.建立TreeSet集合对象,TreeSet传入比较器。 TreeSet<Integer> ts = new TreeSet<>(new Comparator<Integer>() { //将比较器传给TreeSet的构造方法 @Override public int compare(Integer i1, Integer i2) { int num = i2 - i1; //自动拆箱 // int num = i2.csompareTo(i1); return num == 0 ? 1 : num; }}); System.out.println("请输入一个整数:"); //3.无限循环接收整数,遇到Quit退出,用字符串的形式接收。 while(true) { String line = sc.nextLine();//将键盘录入的字符串存储在line中 if("quit".equals(line)) {//若是字符串常量和变量比较,常量放前面,这样不会出现空指针异常,变量里面可能存储null break; } //4.判断quit就退出,不是就将其转换为Integer,并添加到集合中 Integer i = Integer.parseInt(line);//将数字字符串转换成数字 ts.add(i); } //5.遍历TreeSet集合并打印每个元素。 for (Integer integer : ts) { System.out.print(integer); } } }
//1.定义一个学生类 //a.成员变量:姓名,语文成绩,数学成绩,英语成绩,总成绩 //b.成员方法:空参有参构造,toString方法,在遍历集合中的Student对象,打印对象引用的时候会显示属性值 public class Student { private String name; private int chinese; private int math; private int english; private int sum; public Student() { super(); } public Student(String name, int chinese, int math, int english) { super(); this.name = name; this.chinese = chinese; this.math = math; this.english = english; this.sum = this.chinese + this.math + this.english; } public int getSum() { return sum; } public String toString() { return name + "," + chinese + "," + math + "," + english + "," + sum; } }
import java.util.Comparator; import java.util.Scanner; import java.util.TreeSet; public class Demo7 { public static void main(String[] args) { //2.键盘录入须要Scanner,建立键盘录入对象 Scanner sc = new Scanner(System.in); System.out.println("请输入一个学生成绩:姓名,语文成绩,数学成绩,英语成绩"); // 3.建立TreeSet集合对象,在TreeSet的构造函数中传入比较器,按照总分比较 TreeSet<Student> ts = new TreeSet<>(new Comparator<Student>() { @Override public int compare(Student s1, Student s2) { int num = s2.getSum() - s1.getSum(); return num == 0 ? 1 : num; }}); //4.录入五个学生,以集合中的学生个数为判断条件,若是size是小于5就进行存储 while(ts.size() < 5) { // 5.将录入的字符串切割,用逗号切割,会返回一个字符串数组,将字符串数组中从第二个元素开始转换成int数 String line = sc.nextLine(); String[] arr = line.split(","); int chinese = Integer.parseInt(arr[1]); int math = Integer.parseInt(arr[2]); int english = Integer.parseInt(arr[3]); //6.将转换后的结果封装成Student对象,将Student添加到TreeSet集合中 ts.add(new Student(arr[0], chinese, math, english)); } //7.遍历TreeSet集合打印每个Student对象 System.out.println("排序后的学生信息:"); for (Student s : ts) { System.out.println(s); } } }
1.List
2.Set