繁体   English   中英

Java中不同类型的2D数组列表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM