转为对象集合_集合对象(三)——set

写在前面:代码中均有详细注释,文本内容中不再赘述

set:保证元素的唯一性

HashSet保证元素的唯一

公用类Student

package bean;
public class Student {
	private int age;
	private String name;
	public Student() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Student( String name,int age) {
		super();
		this.age = age;
		this.name = name;
	}
	@Override
	public String toString() {
		return "Student [age=" + age + ", name=" + name + "]";
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public int hashCode() {
		final int prime = 31; //是一个质数,既不大也不小
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());//name=null返回0,不为空返回哈希值
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)					//调用对象和传入对象是同一个对象
			return true;                    //返回ture
		if (obj == null)					//传入对象为null
			return false;					//返回false
		if (getClass() != obj.getClass())	//调用对象和传入对象的字节码文件不同
			return false;					//返回false
		Student other = (Student) obj;		//向下转型
		if (age != other.age)				//调用对象年龄与传入对象年龄不等
			return false;					//返回false
		if (name == null) {					//调用对象姓名为null
			if (other.name != null)			//传入对象姓名不为null
				return false;				//返回false
		} else if (!name.equals(other.name))//调用对象姓名不等于传入对象
			return false;					//返回false
		return true;						//否则返回true
	}
	
	
}

Demo1用HashSet存储字符串并遍历

package set;

import java.util.HashSet;

public class Demo1_Hashset {
	/*
	 * Hashset存储字符串并遍历
	 * */
	public static void main(String[] args) {
		
		HashSet<String> str=new HashSet<>();
		str.add("a");
		str.add("b");
		System.out.println(str);
		for (String string : str) {
			System.out.println(string);
		}
}
}

运行结果:

2c4bfbed97fa78089048fab989332d89.png

Demo1Plus用HashSet存储自定义对象并遍历且去除重复(再次强调去除重复必须重写类中的HasCode(),equals()方法)

package set;

import java.util.HashSet;

import bean.Student;

/*
 * 存储自定义对象并保证元素唯一
 * */
public class Demo1_HashsetPlus {
	public static void main(String[] args) {
		HashSet<Student> hs=new HashSet<>();
		hs.add(new Student("张三", 23));
		hs.add(new Student("张三", 23));
		hs.add(new Student("李四", 23));
		hs.add(new Student("李四", 23));
		hs.add(new Student("王五", 23));
		hs.add(new Student("赵六", 23));  //HashSet保证元素唯一的方法是:new 一个对象时会调用hashcode()方法生成一个Hashcode,当hash值一样时,在调用equals方法做判断,所以要重写equals和hashCode方法,提高了去重复效率
		
		for (Student student : hs) {
			System.out.println(student
					);
		}
	}
}

运行结果如下:

ad45d28712d15df957562137f7db9894.png

LinkedHashSet:保证元素的唯一性,且怎么存就怎么取。

package set;

import java.util.LinkedHashSet;//怎么存怎么取且保证了元素的唯一性

public class Demo2_LinkedHashSet {
	public static void main(String[] args) {
		LinkedHashSet<Integer> lhs=new LinkedHashSet<>();
		lhs.add(1);
		lhs.add(2);
		lhs.add(3);
		lhs.add(5);
		lhs.add(4);
		
		System.out.println(lhs);
 } 
}

运行结果如下:

9c422c60927253baa538f39c03990aa3.png

需求:编写一个程序,获取10个1至20的随机数,要求随机数不能重复。并把最终的随机数输出到控制台。

package test;

import java.util.HashSet;
import java.util.Random;

public class Test1 {
	/* A:案例演示
	* 需求:编写一个程序,获取10个1至20的随机数,要求随机数不能重复。并把最终的随机数输出到控制台。
	* 
	* 分析:
	* Random创建对象
	* Hashset实现不重复,比LinkedHashSet效率高
	*/
public static void main(String[] args) {
	Random r=new Random();
	HashSet<Integer> hs=new HashSet<>();
	while(hs.size()<=10){
		hs.add(r.nextInt(20)+1);
	}
	
	System.out.println(hs);
}
}

运行结果如下:

9d9b302d969d19b6f6c8780a7c20249c.png

使用Scanner从键盘读取一行输入,去掉其中重复字符, 打印出不同的那些字符

package test;

import java.util.HashSet;
import java.util.Scanner;

import javax.print.DocFlavor.CHAR_ARRAY;

public class Test2_Scanner {
	/* 使用Scanner从键盘读取一行输入,去掉其中重复字符, 打印出不同的那些字符
	* aaaabbbcccddd
	* 
	*实现步骤:从键盘获取字符串
	*字符串转为字符数组
	*遍历字符数组添加到HashSet中并遍历输出
	*/
	public static void main(String[] args) {
		  Scanner sc = new Scanner(system.in - 这个网站可出售。 - 最佳的System 来源和相关信息。);
		     String i = sc.nextLine();
		     System.out.println(i);
		     char[] cr=i.toCharArray();
		     HashSet<Character> hs=new HashSet<>();
		    for (char c : cr) {
				hs.add(c);
			}
		     System.out.println(hs);
	}
}

运行结果如下:

07d1c5d111d883dd945e6c0a0f6c73d7.png

TreeSet集合可以保证元素的唯一并且实现排序

package set;

import java.util.Comparator;
import java.util.TreeSet;
public class Demo3_TreeSet {
	/*
	 * * A:案例演示
	 * TreeSet保证元素唯一和比较器排序的原理及代码实现
	 * 
	 * String的自然比较方法是安装Unicode编码或字典,要实现按照字符串长度比较需要重写方法,而重写的方法需要通过实现接口。
	 * */
	public static void main(String[] args) {
		TreeSet<String> ts=new TreeSet<>(new Compare());	//TreeSet(Comparator<? super E> comparator) 构造一个新的空 TreeSet,它根据指定比较器进行排序。

		ts.add("yaa");
		ts.add("a");
		ts.add("csaa");
		ts.add("aaaw");
		ts.add("wa");
		
		System.out.println(ts);
		
		
	}
	
	
}

class Compare implements Comparator<String>{
	
@Override
public int compare(String o1, String o2) {
	// TODO Auto-generated method stub
	int num=o1.length()-o2.length();		//
	return num==0?o1.compareTo(o2):num;
	
}
}

83d8932bfecd8d93460382b834d0e4bf.png

由于代码练习较多,过两天会有对应的文本整理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值