[英]2D Array List of different types in Java
所以这让我有些困惑。 我正在尝试制作一个包含对象的数组列表,并且每个对象都会有一个与之关联的字符串。
例如,假设我有这个相邻房间的数组列表...
ArrayList<Object> adjacentRooms = new ArrayList<Object>();
我可以将Room对象添加到与任何主题相邻的那个数组列表中。.但是,当我使用adjacentRooms.add(x);
添加到数组列表中时adjacentRooms.add(x);
(其中x可以是Room类型的对象)。我也想在该位置添加一个字符串。 例如adjacentRooms.add(x, "north");
.. <-现在,我知道这是不可能的,除非我可能要做类似2D数组的列表?
因此,经过一段时间的研究,我很茫然。 我只是不太清楚如何在2D数组列表中添加带有关联字符串的对象...
ArrayList只能保存一种数据类型。 但是我很好奇为什么您不能将字符串作为您正在谈论的对象的成员。 由于您需要二维数组列表,因此我假设字符串和“ room”相关
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”表示字符串ArrayList的索引,而k表示该“ i” ArrayList中字符串的索引。
但是,该结构不会存储您正在谈论的“对象”。
希望能有所帮助。
使用Map
代替List
:可以将一个值“映射”到另一个值,并将其存储在集合中。
像这样:
Map<String, Room> adjacentRooms = new HashmMap<>();
adjacentRooms.put("north", room);
adjacentRooms.get("east");
您可能要使用常量,以确保值是“离散的”。
它有一个缺点,例如:它不能为一个键分配超过1个值,即不能向一个方向分配1个以上Room
...
ArrayList中的“数组”描述了列表的实现方式。
列表始终是一维的。 如果需要更多维度,请在列表中使用可以存储其他信息的对象。
因此,要么创建一个用于保存数据的新类(例如,具有成员Room和String的DetailsRoom),要么使用现有的集合类。 后者的设计较差,但仍然...例如可以是List,这样您最终得到List<List<Object>>
。
如果您要创建自己的课程,这就是我所做的...
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 )中的地图对于这种情况非常有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.