package 做業;java
//定義罪犯Criminal類,height(身高)/weight(體重)/blood(血型)/home(籍貫)屬性。算法
//重寫hashcode和equals,使用四個屬性的組合進行實現。數組
//建立HashSet集合,裏面存放20個Criminal對象,其中O型血2人,A型血3人,B型血4人,AB型血1人,其他血型不詳。ide
//注意:hashcode()方法實現時,要求身高、體重、和血型三個屬性合成一個數字,實現兩兩比較的高效算法。函數
import java.util.HashSet;工具
import java.util.Set;this
class Criminal{spa
private int height;code
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<? extends Object> 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<Criminal> cSet = new HashSet<Criminal>();
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<Person, Dog> map=new HashMap<Person,Dog>();
List<Person> keys=new ArrayList<Person>();
///////////////////////////////重要//////////////////////////////////////////////////////////
///////////////////////////////重要//////////////////////////////////////////////////////////
///////////////////////////////重要//////////////////////////////////////////////////////////
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<K> 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<Map.Entry<K,V>> entrySet()返回此映射中包含的映射關係的 set 視圖。
for (Entry<Person,Dog> 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<K> 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<Person, Dog> map=new Hashtable<Person,Dog>(); List<Person> keys=new ArrayList<Person>(); 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<Person, Dog> entry:map.entrySet() ) { // interface Entry<K,V> API裏面搜map,是接口 Map.Entry<K,V> // Set<Map.Entry<K,V>> 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()); } }
-------------------------------------------】