2013-12-08 25 views
-1
class PlayerNames { 

     String OrigName; 
     String TagName; 
     //String DispName; 

     PlayerNames(String OrigName,String TagName) { 
      this.OrigName = OrigName; 
      this.TagName = TagName; 
      //this.DispName = DispName; 
     } 
    } 
HashMap<PlayerNames, Integer> PlayerTempNeutral = new HashMap<PlayerNames, Integer>(); 
PlayerTempNeutral.put(new PlayerNames(new String("Bob"),new String("BobsWindshield"), 1); 
PlayerTempNeutral.put(new PlayerNames(new String("Ron"),new String("RonsDoor"), 1); 

如何使用此類來獲取Bob和BobsWindshield?我基本上想要3個值,並且我在谷歌上找到了這個片段,但我不知道如何「獲得」價值。我想獲得基於OrigName或「鮑勃」 喜歡的東西帶類的散列圖

If(PlayerTempNeutral.OrigName == "Bob"){ 
String CarPart = PlayerTempNeutral.TagName; //This would show BobsWindshield ONLY 
} 

我試着用搜索引擎包含HashMap的例子,但它們僅表現爲個位數,沒有人真正清楚使用類

+2

你不能從一個帶有部分關鍵字的地圖中獲取。 – jtahlborn

+1

部分密鑰?我不太明白 –

回答

2

幾件事情在這裏糾正,我將試圖解決那些我看到的。

首先,Java標準是用小寫名稱變量。因爲一切都看起來像一個類型名稱,所以很難另外閱讀。

第二個,千萬不要使用new String()來創建一個新的字符串Object。 Java字符串是不可變的,JVM維護應用程序中使用的字符串池。與new String()創建一個字符串,將建立從傳遞給該構造函數的字符串,它是從池中提取,但單獨分配(因此,實際上,不必要的,可能會在已經存在的字符串對象分配更多的內存品牌新副本游泳池)。相反,只需傳遞字符串"bob""BobsWindshield"即可。

最後是,要直接回答這個問題,因爲你確切的用例是不確定的,你的解決方案甚至可能不需要散列。如果您只關心同一類型的多個對象的普通簡單存儲,您也許可以改爲使用ArrayList

然而,爲了使用HashMap,你需要記住,一個Hash /地圖是一個鍵值對的集合。如果您的目的是存儲和索引多個對象,您當前的實現基本上是非感性的。做到這一點,而不是:

HashMap<String, PlayerNames> playerTempNeutral = new HashMap<String, PlayerNames>(); 
playerTempNeutral.put("Bob", new PlayerNames("Bob", "BobsWindshield"); 
playerTempNeutral.put("Ron", new PlayerNames("Ron", "RonsDoor"); 

在這個例子中,「鮑勃」或「羅恩」是關鍵,和相應的PlayerNames對象是與該鍵的數值。

爲了得到,你根本就這麼用鑰匙從收集的對象之一(或「指數值」,我想你可以稱呼它):

PlayerNames bob = playerTempNeutral.get("bob"); 

當然,一旦你有你的bob對象,你可以根據需要使用它(例如:bob.TagName)。

我懷疑這可能不一定是你的用例,所以如果你需要額外的信息,你將不得不詳細說明。

希望這會有所幫助。

+0

好吧,那麼我將如何參考BobsWindshield/Ronsdoor? –

+0

@GinzoMilani剛做了一個更新,忘了添加如何從哈希中獲取東西 –

+1

謝謝,這正是我所需要的,歡呼聲〜 –

1

你應該重載hashCode並等於您的PlayerNames類中的Object類的方法。

當你想獲得OrigName實例變量的基礎上只在計算哈希碼只所以使用僅此於hashCode方法和equals方法,同時比較。

編輯: 更新類

類PlayerNames {

String OrigName; 
    String TagName; 
    //String DispName; 

    PlayerNames(String OrigName,String TagName) { 
     this.OrigName = OrigName; 
     this.TagName = TagName; 
     //this.DispName = DispName; 
    } 
    @Override 
    public boolean equals(Object o){ 
     if(o instanceof PlayerNames){ 
      PlayerNames p = (PlayerNames)o; 
      return (p.OrigName == this.OrigName); 
     } 
     else 
      return false; 

    } 
    @Override 
    public int hashCode(){ 
     int hashcode=0; 
     int MOD=10007; 
     int shift=29; 
     for(int i=0;i<OrigName.length();i++){ 
      hashcode=((shift*hashcode)%MOD+OrigName.charAt(i))%MOD; 
     } 
     return hashcode; 
    } 
    @Override 
    public String toString(){ 
     return OrigName; 
    } 
} 

對於put和get操作,我只寫下面類

import java.util.HashMap; 
public class MainThread { 
    public static void main(String[] args) { 
     PlayerNames Bob = new PlayerNames(new String("Bob"),new String("BobsWindshield")); 
     HashMap<PlayerNames, Integer> PlayerTempNeutral = new HashMap<PlayerNames, Integer>(); 
     PlayerTempNeutral.put(Bob,100); 
     Integer p = PlayerTempNeutral.get(Bob); 
     System.out.println(p); 

    } 
} 

使用上面的代碼爲實驗目的,如這是一種糟糕的編碼習慣。因爲你是一個新的Java程序員,所以理解概念是最重要的,然後是最佳實踐。

+0

我很新的Java,所以你必須詳細說明:( –

+0

請通過http://howtodoinjava.com/2012/10/09/working-with-hashcode-and-equals-methods -in-java /,它有一個等於樣本類和哈希碼方法 – Vipin

+1

@GinzoMilani,在另一個答案Teeg給出了很好的解釋,但由於你是新來的java我會更新我的答案與你更新的類 – Vipin