做業_java基礎第十一天_集合

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());
		
	}
}

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

相關文章
相關標籤/搜索