2011-12-13 22 views
1

我想準確創建SetHashSet到僅包含char。例如a,b,c,d,e,f,g... 但這些char s的未由圖元類型表示,但我有一個對象設置哈希碼和等於創建一組唯一的對象

public FirstChar{ 

    private char c; 

    public FirstChar(char c){ 

    this.c = c; 

    } 
} 

現在我想的對象FirstChar添加到一組,但爲了避免重複的元素我要實現HashCode()equals()

我知道如何實現equals但我怎麼能實現hashcode在我可以只有一個元素的方式?

注意:請不要說我使用Eclipse

+0

你想每個'a','b','c'等最多隻有一個,還是隻有一個字符在整個集合中? – soulcheck

+0

yes.only整個集合中的一個字母 – Mazzy

+0

@Mazzy:所以你想* FirstChar的每一個*實例與其他實例相同?這聽起來很奇怪。也許你可以更詳細地解釋你的用例。 –

回答

3

編輯:我剛剛看了你的評論,你只需要在整個集合中的一個字母 - 這聽起來像一個非常奇怪的要求,但它基本上是由像完成:

public final class FirstChar { 

    private final char c; 

    public FirstChar(char c) { 
    this.c = c; 
    } 

    @Override public int hashCode() { 
     return 0; 
    } 

    @Override public boolean equals(Object other) { 
     return other instanceof FirstChar; 
    } 
} 

在換句話說,FirstChar每個實例被視爲等於所有其他情況下,它們都具有相同的散列碼。正如我所說,這真的很奇怪......是不是絕對是你想要什麼?


原來的答覆

實施hashCode()用於僅僅在邏輯上具有單個字符的值很簡單:

@Override 
public int hashCode() { 
    return c; // Use implicit conversion to int 
} 

對證的Object.hashCode合同,你會發現這個作品罰款 - 假設你的equals方法基本上只比較c的值。 (當你寫下「我可以只有一個元素在集合中的方式」時,我不清楚你的意思是什麼 - 我假設你的意思是每個不同的字符只有一個元素。)

但是,我很困惑什麼通過使用java.lang.Character可提供您的FirstChar課程的價值。有什麼理由不能僅僅使用Set<Character>

+0

喬恩Skeet偶爾贏得這麼多徽章,通知隱藏他的整個瀏覽器。他繼續不受阻礙地回答問題。 –

+0

我不使用包裝的原因字符是因爲每個字母都必須包含一個對象集合其姓氏以該字母開頭的人 – Mazzy

+1

@Mazzy:這聽起來像一個非常奇怪的要求 - 任何原因你不使用' Map >'或類似的東西(例如Guava的'Multimap')? –

1

在任何情況下,從我所知道的,Character類中的hashCode方法只是將char作爲int返回。

在特定情況下,如果你想設置爲僅包含第一個FirstChar添加到它,你可以使所有FirstChar能勝任對方:

class FirstChar{ 
    private char c; 
    public FirstChar(char c){ 
     this.c=c; 
    } 
    public String toString(){ 
     return String.valueOf(c); 
    } 
    public boolean equals(Object o){ 
     return o instanceof FirstChar; 
    } 
    public int hashCode(){   
     return 42; 
    } 
} 

但是,除非你有一個很好的理由,這聽起來不是一個好主意。