package 作业;

//定义罪犯Criminal类,height(身高)/weight(体重)/blood(血型)/home(籍贯)属性。

//重写hashcode和equals,使用四个属性的组合进行实现。

//创建HashSet集合,里面存放20个Criminal对象,其中O型血2人,A型血3人,B型血4人,AB型血1人,其余血型不详。

//注意:hashcode()方法实现时,要求身高、体重、和血型三个属性合成一个数字,实现两两比较的高效算法。


import java.util.HashSet;

import java.util.Set;


class Criminal{

private int height;

private int weight;

private int blood;

private String home;//籍贯

//带参构造

//注意:hashcode()方法实现时,要求身高、体重、和血型三个属性合成一个数字,实现两两比较的高效算法。

public Criminal(int height,int weight,int blood){

if(height<=0){

System.out.println("身高不能为负数");

System.exit(-1);

//public static void exit(int status)终止当前正在运行的 Java 虚拟机。参数用作状态码;根据惯例,非零的状态码表示异常终止。 

}else if(weight<=0){

System.out.println("体重不能为负数");

System.exit(-1);

}else if(blood>3||blood<0){

System.out.println("血型,必须为0-3之间的值");

System.exit(-1);

}else{

this.height=height;

this.weight=weight;

this.blood=blood;

}

}


//get,set方法

public int getHeight() {

return height;

}


public void setHeight(int height) {

this.height = height;

}


public int getWeight() {

return weight;

}


public void setWeight(int weight) {

this.weight = weight;

}


public int getBlood() {

return blood;

}


public void setBlood(int blood) {

this.blood = blood;

}


public String getHome() {

return home;

}


public void setHome(String home) {

this.home = home;

}

/**

* 重写hashcode和equals,使用四个属性的组合进行实现。

* -----------------------------重写hashcode方法

*/

public int hashCode(){

//×××有32位,这里还要先写ArrayTools类

int i0=0<<24;

int i1=(ArrayTools.int2Bytes(height)[0]&0xff)<<16;

int i2=(ArrayTools.int2Bytes(weight)[0]&0xff)<<8;

int i3=(ArrayTools.int2Bytes(blood)[0]&0xff)<<0;

int newResult=i0|i1|i2|i3;

return home==null?newResult:newResult+home.hashCode();

}

//重写euuqals方法

public boolean equals(Object obj){

if(obj==null)

return false;

if(obj==this){

return true;

}

//精准判断

if(obj.getClass()==Criminal.class){

//public final Class getClass()返回一个对象的运行时类。该 Class 对象是由所表示类的 static synchronized 方法锁定的对象。 

Criminal c=(Criminal)obj;

if(c.height==this.height&&c.weight==this.weight&&c.blood==this.blood){

return true;

}

}

return false;

}

}


class ArrayTools{//和重写hashCode,equals相关的工具类

/**

* ×××转换为字节数组,然后强转截断

*/

public static byte[] int2Bytes(int i){

byte[] bytes=new byte[4];//new一个长度为4的字节数组

bytes[0]=(byte)i;//低位

bytes[1]=(byte)(i>>8);//第9-16位在操作

bytes[2]=(byte)(i>>16);//17-24位的在操作

bytes[3]=(byte)(i>>24);//第25-32位的在操作

return bytes;

}

/**

* 字节数组转为整数,向左移位,由于向左移位,先转换为整数,缺的用符号位补齐,故用&0xFF去除--应该不用&0xff也可以,这里<<是无符号位移,补的是0

*/

public static int byte2Int(byte[] bytes){

int i0=bytes[3]<<24;//变为25-32位

int i1=(bytes[2]&0xFF)<<16;//变为17到24位----.

//F是15,就是 1111,两个ff就是1111 1111

//和他做与运算的话0000 0000 0000 0000 0000 0000 1100 0110 &1111 1111 ----还是有点没弄懂-应该不用&0xff也可以,这里<<是无符号位移,补的是0

int i2=(bytes[1]&0xFF)<<8;//变为9-16位

int i3=(bytes[0]&0xFF)<<0;//待在原位

return i0|i1|i2|i3;//32位数重新或在了一起

}

}



public class HashSetTest1 {


public static void main(String[] args) {

Set cSet = new HashSet();

Criminal c1=new Criminal(180,170,2);

Criminal c2=new Criminal(170,180,0);

Criminal c3=new Criminal(160,180,1);

Criminal c4=new Criminal(150,180,3);

Criminal c5=new Criminal(150,180,3);

cSet.add(c1);

cSet.add(c2);

cSet.add(c3);

cSet.add(c4);

cSet.add(c5);

System.out.println(c1.equals(c2));//用了罪犯类里面重写的equals方法

System.out.println(c5.equals(c4));

for(Criminal c:cSet){//对cSet进行迭代,定义了一个局部变量c,来引用cSet集合的每个元素

out(c);//为这里增强for循环写一个方法

}

}

public static void out(Criminal c){

String blood="";

switch(c.getBlood()){//在构造函数里面有定义血型的数值,c.getBlood()调用构造成的血型值

case 0:

blood="A";

break;

case 1:

blood="B";

break;

case 2:

blood="AB";

break;

case 3:

blood="O";

break;

}

System.out.println("身高:"+c.getHeight()+"\t 体重:"+c.getWeight()+"\t"+"血型:"+blood);

}

}


【--------------------------------作业2-------------------------------------------】

package 作业;


import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import java.util.Map.Entry;


//key(键) - value(值) :kv对.

//

//创建HashMap,Person为key,Dog为value。

//存放100元素,遍历map集合,两种方式。EntrySet + KeySet.

//删除操作。remove();


/**

 * 

 * hashcode+equals

 *

 */

class Person{//Person为key,Dog为value。

private String name;

private int age;

//构造带参

public Person(String name, int age) {

super();

this.name = name;

this.age = age;

}

//get,set

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;

}

//重写hashCode

public int hashCode(){

return name==null?age:name.hashCode()+age;

}

//重写equals

public boolean equals(Object obj){

if(obj==null)

return false;

if(obj==this)

return true;

//精准判断

if(obj.getClass()==Person.class){

Person p=(Person)obj;

//name是否相同

//name是null

boolean nameEqu=false;

if(this.name==null){

if(p.name==null){

nameEqu=true;

}

else{

nameEqu=false;

}

}//name不是null

else{

nameEqu=name.equals(p.name);

}

//age是否相同

boolean ageEqu=(this.age==p.age);

return nameEqu&&ageEqu;

}

return false;

}

}


/**

 * 狗

 * @author Administrator

 *

 */

class Dog{

private String name;

private int age;

public Dog(){}

public Dog(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;

}

}

//key(键) - value(值) :kv对.

//

//创建HashMap,Person为key,Dog为value。

//存放100元素,遍历map集合,两种方式。EntrySet + KeySet.

//删除操作。remove();

public class HashMapTest2 {

public static void main(String[] args) {

Map map=new HashMap();

List keys=new ArrayList();

///////////////////////////////重要//////////////////////////////////////////////////////////

///////////////////////////////重要//////////////////////////////////////////////////////////

///////////////////////////////重要//////////////////////////////////////////////////////////

for(int i=0;i<100;i++){

Person p=new Person("person"+i, i);

map.put(p, new Dog("dog"+i,i));//往map里面添加元素

keys.add(p);//把person对象加入list集合列表里面

}

System.out.println("-------------------keySet----------");

for (Person p : map.keySet()) {//Set keySet()返回此映射中包含的键的 set 视图。

System.out.println(p.getName()+"    "+map.get(p).getName());

//public V get(Object key)返回指定键在此标识哈希映射中所映射的值,如果对于此键来说,映射不包含任何映射关系,则返回 null。-map.get(person)

}

System.out.println("-------------------EntrySet----------");

//Set> entrySet()返回此映射中包含的映射关系的 set 视图。

for (Entry entry : map.entrySet()) {

System.out.println(entry.getKey().getName()+"  "+entry.getValue().getName());

}

//----------------

System.out.println("=-----before remover-----------map.size:"+map.size());

for(Person p:keys){

map.remove(p);//删除操作

//public V remove(Object key)如果此映射中存在该键的映射关系,则将其删除。 

}

///////////////////////////////重要//////////////////////////////////////////////////////////

///////////////////////////////重要//////////////////////////////////////////////////////////

///////////////////////////////重要//////////////////////////////////////////////////////////


//重新遍历就没有了

for (Person p : map.keySet()) {//Set keySet()返回此映射中包含的键的 set 视图。

System.out.println(p.getName()+"    "+map.get(p).getName());

}

//for(Person p:keys){//对集合列表keys进行迭代,定义了一个局部变量p,来引用keys集合的每个元素(里面的每个元素是Person的对象)

//System.out.println(p.getName());;//删除操作----没用,就写写

//}

System.out.println("=-----after remover-----------map.size:"+map.size());

}

}







【--------------------------------作业3

package 作业;

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class HashTableTest3 {
	public static void main(String[] args){
		Map map=new Hashtable();
		
		List keys=new ArrayList();
		
		for (int i = 0; i < 100; i++) {
			Person p=new Person("person"+i, i);
			map.put(p, new Dog("dog"+i,i));
			keys.add(p);	
		}
		
		System.out.println("--------------keySet-------------");
		for (Person person : map.keySet()) {
			System.out.println(person.getName()+"    "+map.get(person).getName());
//			public V get(Object key)返回指定键在此标识哈希映射中所映射的值,如果对于此键来说,映射不包含任何映射关系,则返回 null。-map.get(person)
//			System.out.println(map.get(person));//单打是地址值
		}
		System.out.println("-------------------entryset---------");
		for (Entry entry:map.entrySet() ) {
//			 interface Entry  API里面搜map,是接口 Map.Entry
//			Set> entrySet()返回此映射中包含的映射关系的 set 视图。
			System.out.println(entry.getKey().getName()+"    "+entry.getValue().getName());
			//K getKey()返回与此项对应的键。 
		}
		
		System.out.println("-------------befor remove------map.size: "+ map.size());
		
		for(Person p:keys){
			map.remove(p);
		}
		
		System.out.println("-------------after remove------map.size: "+ map.size());
		
	}
}

-------------------------------------------】