搜索包含用于这些对象的集合的Hashmap

时间:2013-05-02 08:38:18

标签: java hashmap set

我有一类物体。理想情况下,我想把它们分成五组。然后,我想将所有这五个集合添加到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,如上所述。但是,我不确定这是否可行 - 到目前为止我的实验还没有成功。

3 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分: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应该是不可变的et-all。

答案 2 :(得分:0)

你是否需要将该物体拉出装置并用它做一些事情或者只是检查它是否在那里。如果你只需要检查它是否在那里,以下将是好的

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

如果您需要实际让对象对其进行操作,请在if语句中查看该集合,并检查每个对象是否与您要查找的内容相匹配。