2D Array Java中不同类型的列表

时间:2017-10-13 01:20:39

标签: java arrays arraylist

所以这件事让我有点难过。我试图制作一个包含对象的数组列表,每个对象都有一个与之关联的字符串。

举个例子,假设我有相邻房间的数组列表......

ArrayList<Object> adjacentRooms = new ArrayList<Object>();

我可以将Room对象添加到与任何主题相邻的数组列表中..但是,当我使用adjacentRooms.add(x);(其中x可以是对象Room类型)添加到数组列表时..我也会喜欢在该位置添加一个字符串。例如adjacentRooms.add(x, "north"); ..&lt; - 现在我知道这是不可能的,除非我可能做像2D数组列表那样的事情吗?

所以经过一段时间的研究,我感到很茫然。我无法弄清楚如何在2D数组列表中添加带有关联字符串的对象...

4 个答案:

答案 0 :(得分:1)

ArrayList只能包含一种数据类型。但我很好奇为什么你不能将一个字符串作为你所谈论的对象中的一个成员。既然你想要一个2d arraylist,我假设字符串和“房间”是相关的

Object foo = new Object();
foo.data = "your string"
adjacentRooms.add(foo);

通过

访问
adjacentRooms.get(index).data

但是,如果必须,你可以做一个2d ArrayList,但是它们很烦人 ArrayList<ArrayList<String> > list = new ArrayList();

访问类似于list.get(i).get(k),其中'i'指的是String的ArrayList的索引,而k指的是'i'ArrayList中的String的索引。

但是,该结构不存储您正在谈论的“对象”......

希望有所帮助。

答案 1 :(得分:1)

而不是List使用Map:可以将值“映射”到另一个值,并将其存储在集合中。
像这样:

Map<String, Room> adjacentRooms = new HashmMap<>();

adjacentRooms.put("north", room);
adjacentRooms.get("east");

您可能希望使用常量,以确保值是“离散的”。

它有一个缺点,即:它不能为一个键分配超过1个值,即方向超过1 Room ...

答案 2 :(得分:1)

&#34;数组&#34;在ArrayList中描述了列表的实现方式。

列表始终是一维的。当您需要更多维度时,请使用列表中可存储其他信息的对象。

因此要么创建一个包含数据的新类(例如,包含成员Room和String的DetailedRoom),要么使用现有的集合类。后者将是一个糟糕的设计,但仍然......例如它可能是List,所以你最终得到List<List<Object>>

答案 3 :(得分:0)

如果你要创建自己的课程......这就是我所做的......

public class AdjacentRoom {
    private Room room;
    private String direction;
    public AdjacentRoom(Room room, String direction) {
        this.room = room;
        this.direction = direction;
    }
    public Room getRoom(){
        return room;
    }
    public String getDirection(){
        return direction;
    }
}

另外,为了举例,这里有一个裸骨房间......

public class Room {
    private String name;
    public Room(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }
}

这一切让我能做的是......

//Firstly i can create a room...
Room testRoom = new Room("Test Room");
//If i change my array list in the question to an AdjacentRoom list...
ArrayList<AdjacentRoom> adjacentRooms = new ArrayList<AdjacentRoom>();
//I can add rooms and strings to it like this..
adjacentRooms.add(new AdjacentRoom(testRoom, "north"));

现在我仍然可以访问每个房间方法,同时还打印每个房间相关的每个字符串或“方向”..例如..

for(AdjacentRoom room : adjacentRooms){
        System.out.println(room.getRoom().getName() + " " + room.getDirection());
}

虽然这是一个很酷的自定义解决方案,但使用像Usagi Miyamoto的回答(link)这样的地图非常适合这种情况。