2013-05-02 52 views
0

我有一類對象。理想情況下,我想將它們全部分成五組。然後,我想將所有這五個集合添加到一個HashMap中,併爲它們分配一個唯一的標識符。搜索包含這些對象的集合的HashMap

最後,我希望能夠搜索HashMap不是爲了集合,而是爲集合中包含的對象。這可能嗎?我查閱了有關HashMaps的儘可能多的信息,但似乎無法找到這樣做的方法。如果我不能,任何人都有什麼好的選擇?

編輯 - 示例代碼:

public class Cell{ 
    private int x; 
    private int y; 

    public Example(int x, int y) { 
     this.x= x; 
     this.y= y; 
    } 
} 

然後,使用的MouseListener我發現這裏的網格上用戶點擊。我通過調用一個方法來確定下一艘船將被放置多長時間,從而確定他們放置了多少艘船(正在模擬戰艦遊戲)。然後我做到這一點:

for (int i = 0; i < currentShipLength; i++) 
    playerGridLogic.addCellsWithShips(new Cell(x, y+ i)); 
numberOfPlayerShipsPlaced++; 

最後,一旦所有的船舶放置,我想將它們添加到HashMap。目前,我將所有的船隻都加入到一個大集合中。當電腦點擊我的網格單元,以下規則執行:

if (playerGridLogic.getCellsWithShips().contains(attackedCell)) { 
    playerGrid.getCellArray()[xPos][yPos].setBackground(Color.ORANGE); 
} 
else { 
    playerGrid.getCellArray()[xPos][yPos].setBackground(Color.MAGENTA); 
} 

雖然這所有的作品完美,它只是告訴我船被擊中。它並不告訴我哪一個,我想知道哪一個,以便在該船被銷燬時向用戶輸出信息。

我認爲最簡單的方法是創建五個集合而不是一個,然後將它們添加到HashMap中,如上所述。但是,我不確定這是否可行 - 迄今爲止,我的實驗還沒有奏效。

+0

你在「五套獨立」中意味着什麼?什麼樣的套?你在談論EntrySet嗎?你可以發佈代碼示例嗎? – Omid 2013-05-02 08:45:42

+0

HashSets理想情況下 – 2013-05-02 08:47:24

+0

轉過來不是更容易:不是保留「船與細胞」列表,而是保留一個船舶列表,知道他們的細胞。然後迭代船隻,並讓它們返回,如果他們已被擊中。 – Fildor 2013-05-02 08:58:48

回答

1

這是我寫的一個簡單例子。

import java.util.HashMap; 
import java.util.HashSet; 
import java.util.Map; 
import java.util.Set; 


public class Example{ 
    public static void main(String[] args) { 
     MyObject obj = new MyObject("Kevin"); 
     MyObject obj1 = new MyObject("Chris"); 
     MyObject obj2 = new MyObject("Oliver"); 
     MyObject obj3 = new MyObject("Jack"); 
     MyObject obj4 = new MyObject("Joe"); 

     Set<MyObject> set = new HashSet<MyObject>(); 
     Set<MyObject> set1 = new HashSet<MyObject>(); 
     Set<MyObject> set2 = new HashSet<MyObject>(); 
     Set<MyObject> set3 = new HashSet<MyObject>(); 
     Set<MyObject> set4 = new HashSet<MyObject>(); 

     set.add(obj); 
     set1.add(obj1); 
     set2.add(obj2); 
     set3.add(obj3); 
     set4.add(obj4); 

     Map<String,Set<MyObject>> map = new HashMap<String,Set<MyObject>>(); 
     map.put("s", set); 
     map.put("s1", set1); 
     map.put("s2", set2); 
     map.put("s3", set3); 
     map.put("s4", set4); 

     MyObject found = search(map, "Jack"); 
     System.out.println(found.name); 
    } 

    private static MyObject search(Map<String, Set<MyObject>> map, String string) { 
     for(Set<MyObject> s: map.values()){ 
      for(MyObject mObj:s){ 
       if(mObj.name.equals(string)){ 
        return mObj; 
       } 
      } 
     } 
     return null;   
    } 

} 

class MyObject{ 
    String name; 

    public MyObject(String name){ 
     this.name = name; 
    } 
} 
+0

你是個傳奇人物!謝謝,我知道必須有一種方法。 – 2013-05-02 08:55:25

+0

@AndrewMartin很高興能幫到你。如果您有任何問題,請告訴我。 – 2013-05-02 08:56:20

+0

我修改了這一點,所以它返回了我正在尋找的集合,而不是一個字符串,並在裏面我檢查了對方的座標。這是一個很好的例子。謝謝! – 2013-05-02 09:27:04

0

爲現在駐留在您的集合中的對象創建一個包裝器對象。

例如

interface IdentifiableWrapper { 
Object setObject(); // this is the object you want to search 
Object id(); // id that you generate and assign to each object and later use to search 
} 

現在添加此對象的實例,以你的HashMap和搜索。我已經跳過提到像hashmap中的key/id這樣的指導方針應該是不可變的。

0

您是否需要將該對象從該集合中取出並對其執行某些操作,或者只是檢查它是否在該集合中。如果你只需要檢查它是否在那裏下面將精

boolean isInMap = false; 
for(Set<MyObject> s: map.values()){ 
    if(s.contains(objectToSearchFor)){ 
     isInMap=true; 
     break; 
    } 
} 

如果您需要實際獲得對象採取行動,那麼,if語句裏,你可以看看通過設置和檢查,如果每個一個匹配你正在尋找的東西。

相關問題