1. 程式人生 > >java list按物件的某個屬性進行排序,和判斷相等

java list按物件的某個屬性進行排序,和判斷相等


import java.io.Serializable;

public class ContactItem implements Comparable<ContactItem>,Serializable {
	private String name;
	private String number;
	private String alpha;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getNumber() {
		return number;
	}

	public void setNumber(String number) {
		this.number = number;
	}

	public String getAlpha() {
		return alpha;
	}

	public void setAlpha(String alpha) {
		this.alpha = alpha;
	}
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {

        //按照你想要的方法去比較,比如我這裡比較的是姓名,號碼,相等就返回true
        if(!(obj instanceof ContactItem))
            return false;
        ContactItem contactItem= (ContactItem)obj;
        return (this.getName().equals(contactItem.getName())&&this.getNumber().equals(contactItem.getNumber()));
    }

	@Override
	public int compareTo(ContactItem another) {
		  if (another == null) {                                                
	            try {                                                       
	                throw new Exception("該物件為空!");                          
	            } catch (Exception e) {                                     
	                e.printStackTrace();                                    
	            }                                                           
	        }                                                               
	                                                                        
	        if (!(this.getClass().getName().equals(another.getClass().getName().toString()))) {                                        
	            try {                                                       
	                throw new Exception("該物件的類名不一致!");                      
	            } catch (Exception e) {                                     
	                e.printStackTrace();                                    
	            }                                                           
	        }                                                               
	                                                                        
	        if (!(another instanceof ContactItem)) {                                  
	            try {                                                       
	                throw new Exception("該物件不是ContactItem的例項!");                
	            } catch (Exception e) {                                     
	                e.printStackTrace();                                    
	            }                                                           
	        }                                                               
	        ContactItem contactItem = (ContactItem) another;                                  
	                                                    
	        return this.getAlpha().compareTo(contactItem.getAlpha());    
	}

}

關於排序:

1 : 格式,  實現Comparable<T>介面

          應該這樣寫   public class ContactItem implements Comparable<ContactItem>    

  一開始看的其他人的文章,他居然是這樣寫的  public class Student<T> implements Comparable<T> ,雖然也不報錯,但是明顯不好看。。

2:重寫compareTo(ContactItem another) {}這個方法

3: 呼叫:Collections.sort(list);     

關於判斷是否相等:

1:必須重寫equals(Object obj)方法和重寫hashcode()方法。

規範1:若重寫equals(Object obj)方法,有必要重寫hashcode()方法,確保通過equals(Object obj)方法判斷結果為true的兩個物件具備相等的hashcode()返回值。

規範2:如果equals(Object obj)返回false,即兩個物件“不相同”,並不要求對這兩個物件呼叫hashcode()方法得到兩個不相同的數。說的簡單點就是:“如果兩個物件不相同,他們的hashcode可能相同”。 

根據這兩個規範,可以得到如下推論: 
1、如果兩個物件equals,Java執行時環境會認為他們的hashcode

一定相等。 
2、如果兩個物件不equals,他們的hashcode有可能相等。 
3、如果兩個物件hashcode相等,他們不一定equals。 
4、如果兩個物件hashcode不相等,他們一定不equals。 

2:一開始怎麼都是false,原因是字串的判斷,我居然用了==,應該用.equals();好幼稚的錯,害我還以為是不是 實現Comparable<T>介面 哪裡程式碼寫的有問題。。。