0

我有一类对象。理想情况下,我想将它们全部放入五个单独的集合中。然后,我想将所有这五个集合添加到一个 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 中,如上所述。但是,我不确定这是否可能——我的实验到目前为止还没有奏效。

4

3 回答 3

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;
    }
}
于 2013-05-02T08:53:56.693 回答
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 中的 key/id 这样的准则应该是不可变的。

于 2013-05-02T08:56:45.863 回答
0

您是否需要将该对象从集合中拉出并对其进行处理,或者只是检查它是否在其中。如果您只需要检查它是否在那里,以下将很好

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

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

于 2013-05-02T08:58:06.357 回答