1、创建一个存储学生对象的集合,要求:学生对象的成员变量值相同,我们就认为是同一个对象
未重写hashCode和equals方法 的情况
package learnjava;
public class Student {
private String name;
private int age;
public Student(){
}
public Student(String name,int age){
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;
}
}
package learnjava;
import java.util.HashSet;
public class Demo {
public static void main(String[] args) {
HashSet<Student> hs = new HashSet<>();
Student s1 = new Student("林青霞", 35);
Student s2 = new Student("王祖贤", 30);
Student s3 = new Student("王祖贤", 30);
hs.add(s1);
hs.add(s2);
hs.add(s3);
for(Student s:hs){
System.out.println(s.getName()+","+s.getAge());
}
// 王祖贤,30
// 王祖贤,30
// 林青霞,35
}
}
为保证元素唯一性,应重写hashCode和equals方法
package learnjava;
public class Student {
private String name;
private int age;
public Student(){
}
public Student(String name,int age){
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 boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
if (age != student.age) return false;
return name != null ? name.equals(student.name) : student.name == null;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + age;
return result;
}
}
package learnjava;
import java.util.HashSet;
public class Demo {
public static void main(String[] args) {
HashSet<Student> hs = new HashSet<>();
Student s1 = new Student("林青霞", 35);
Student s2 = new Student("王祖贤", 30);
Student s3 = new Student("王祖贤", 30);
hs.add(s1);
hs.add(s2);
hs.add(s3);
for(Student s:hs){
System.out.println(s.getName()+","+s.getAge());
}
// 林青霞,35
// 王祖贤,30
}
}
2、存储学生对象并遍历,创建集合使用无参构造方法,
要求:按照年龄从大到小排序,年龄相同时,按照姓名的字母顺序排序
自然排序Comparable的使用:自定义类implements Comparable接口,并重写compareTo(To)方法
TreeSet有序
package learnjava;
public class Student implements Comparable<Student> {
private String name;
private int age;
public Student(){
}
public Student(String name,int age){
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 int compareTo(Student s){
int n1=this.age-s.age;//this-s 为升序
int n2=(n1==0)?this.name.compareTo(s.name):n1;
return n2;
}
}
package learnjava;
import java.util.TreeSet;
public class Demo {
public static void main(String[] args) {
TreeSet<Student> hs = new TreeSet<>();
Student s1 = new Student("lin", 35);
Student s2 = new Student("wang", 30);
Student s3 = new Student("zhang", 36);
Student s4 = new Student("feng", 30);
hs.add(s1);
hs.add(s2);
hs.add(s3);
hs.add(s4);
for(Student s:hs){
System.out.println(s.getName()+","+s.getAge());
}
// feng,30
// wang,30
// lin,35
// zhang,36
}
}
3、存储学生对象并遍历,创建TreeSet集合使用带参构造方法,
要求:按照年龄从大到小排序,年龄相同时,按照姓名的字母顺序排序
Comparator的使用,让集合构造方法接收Comparator的实现类对象,重写compare(T o1,T o2)
package learnjava;
public class Student {
private String name;
private int age;
public Student(){
}
public Student(String name,int age){
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;
}
}
package learnjava;
import java.util.Comparator;
import java.util.TreeSet;
public class Demo {
public static void main(String[] args) {
TreeSet<Student> hs = new TreeSet<>(new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
int n1=s1.getAge()-s2.getAge();
int n2=(n1==0)?s1.getName().compareTo(s2.getName()):n1;
return n2;
}
});
Student s1 = new Student("lin", 35);
Student s2 = new Student("wang", 30);
Student s3 = new Student("zhang", 36);
Student s4 = new Student("feng", 30);
hs.add(s1);
hs.add(s2);
hs.add(s3);
hs.add(s4);
for(Student s:hs){
System.out.println(s.getName()+","+s.getAge());
}
// feng,30
// wang,30
// lin,35
// zhang,36
}
}
4、获取10个 1-20之间的随机数,要求随机数不能重复
package learnjava;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
public class Demo {
public static void main(String[] args) {
Set<Integer> set = new HashSet<>();
Random r=new Random();
int x=0;
for(int i=0;i<10;i++){
x=r.nextInt(20)+1;
set.add(x);
}
for(int num:set){
System.out.println(num);
}
// 16
// 19
// 3
// 9
// 10
// 13
// 14
}
}
5、泛型类:
package learnjava;
public class Generic<T> {
private T t;
public T getT(){
return t;
}
public void setT(T t){
this.t=t;
}
}
package learnjava;
public class Demo {
public static void main(String[] args) {
Generic<String> g1=new Generic<>();
g1.setT("林青霞");
Generic<Integer> g2=new Generic<>();
g2.setT(100);
System.out.println(g1.getT());
System.out.println(g2.getT());
//林青霞
//100
}
}
6、泛型方法:
package learnjava;
public class Generic {
public <T> void show(T t){
System.out.println(t);
}
}
package learnjava;
public class Demo {
public static void main(String[] args) {
Generic g=new Generic();
g.show("林青霞");
g.show(100);
//林青霞
//100
}
}
7、泛型接口:
package learnjava;
public interface Generic<T> {
void show(T t);
}
package learnjava;
public class GenericImpl<T> implements Generic<T>{
@Override
public void show(T t){
System.out.println(t);
}
}
package learnjava;
public class Demo {
public static void main(String[] args) {
Generic g=new GenericImpl();
g.show("林青霞");
g.show(100);
//林青霞
//100
}
}
8、Map集合的遍历:
package learnjava;
import java.util.HashMap;
import java.util.Map;
public class Demo {
public static void main(String[] args) {
Map<String,String> map=new HashMap<>();
map.put("二郎神","嫦娥");
map.put("程琉","季朝舟");
map.put("白柳","塔维尔");
//法一
for(String key:map.keySet()){
System.out.println(key+","+map.get(key));
}
System.out.println();
//法二
for(Map.Entry<String,String> entry:map.entrySet()){
System.out.println(entry.getKey()+","+entry.getValue());
}
//程琉,季朝舟
//二郎神,嫦娥
//白柳,塔维尔
//
//程琉,季朝舟
//二郎神,嫦娥
//白柳,塔维尔
}
}
9、统计字符串中每个字符出现的次数
package learnjava;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Demo {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
String s=in.nextLine();
Map<Character,Integer> map=new HashMap<>();
char key;
Integer value;
for(int i=0;i<s.length();i++){
key=s.charAt(i);
value=map.get(key);
if(value==null){
map.put(key,1);
}else {
value++;
map.put(key,value);
}
}
StringBuilder sb=new StringBuilder();
for(Character c:map.keySet()){
sb.append(c).append("(").append(map.get(c)).append(")");
}
String res=sb.toString();
System.out.println(res);
}
}
//aababcabcdabcde
//a(5)b(4)c(3)d(2)e(1)
10、ArryList存储学生对象并排序
package learnjava;
public class Student {
private String name;
private int age;
public Student(){
}
public Student(String name,int age){
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 boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
if (age != student.age) return false;
return name != null ? name.equals(student.name) : student.name == null;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + age;
return result;
}
}
package learnjava;
import java.util.*;
public class Demo {
public static void main(String[] args) {
ArrayList<Student> array=new ArrayList<>();
Student s1 = new Student("lin", 35);
Student s2 = new Student("wang", 30);
Student s3 = new Student("zhang", 36);
Student s4 = new Student("feng", 30);
array.add(s1);
array.add(s2);
array.add(s3);
array.add(s4);
Collections.sort(array, new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
int n1=s1.getAge()-s2.getAge();
int n2=(n1==0)?s1.getName().compareTo(s2.getName()):n1;
return n2;
}
});
}
}
11、模拟斗地主案例
洗牌洗的是牌的编号,发牌也是按编号发,以便从小到大为牌排序(TreeMap)
package learnjava;
import java.util.*;
public class Demo {
public static void main(String[] args) {
String[] colors={"♦","♣","♥","♠"};
String[] numbers={"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
HashMap<Integer,String> map=new HashMap<>();//牌的编号,具体牌
ArrayList<Integer> array=new ArrayList<>();//存储牌的编号
int index=0;
for(String number:numbers){
for (String color:colors){
map.put(index,color+number);
array.add(index);
index++;
}
}
map.put(index,"小王");
index++;
map.put(index,"大王");
Collections.shuffle(array);//洗牌
TreeSet<Integer> first=new TreeSet<>();//第一个人获得的所有牌的编号
TreeSet<Integer> second=new TreeSet<>();
TreeSet<Integer> third=new TreeSet<>();
TreeSet<Integer> dipai=new TreeSet<>();//底牌
for(int i=0;i<array.size();i++){//发牌
int x= array.get(i);
if(i>= array.size()-3){
dipai.add(x);
}else if(x%3==0){
first.add(x);
}else if(x%3==1){
second.add(x);
}else {
third.add(x);
}
}
lookPoker("林青霞",first,map);
lookPoker("张曼玉",second,map);
lookPoker("王祖贤",third,map);
lookPoker("底牌",dipai,map);
}
public static void lookPoker(String name,TreeSet<Integer> t,HashMap<Integer,String> hm){
System.out.print(name+"的牌是:");
for(Integer key:t){
System.out.print(hm.get(key)+" ");
}
System.out.println();
}
//林青霞的牌是:♦3 ♠3 ♥4 ♣5 ♠6 ♥7 ♣8 ♦9 ♠9 ♥10 ♣J ♦Q ♠Q ♥K ♣A ♦2 ♠2
//张曼玉的牌是:♣3 ♦4 ♠4 ♣6 ♦7 ♠7 ♥8 ♣9 ♦10 ♠10 ♥J ♦K ♠K ♥A ♣2
//王祖贤的牌是:♥3 ♣4 ♦5 ♠5 ♥6 ♣7 ♦8 ♠8 ♥9 ♣10 ♦J ♠J ♥Q ♣K ♦A ♠A ♥2
//底牌的牌是:♥5 ♦6 ♣Q
}