我有两个 Collection 对象,我想以可读的方式关联这两个对象中的每个对象(HashMap,故意创建的对象,您选择)。

我正在考虑两个循环,一个嵌套到另一个循环中,但也许这是一个众所周知的问题,并且有一个普遍可以理解的解决方案......

如果 Collection 对象的数量超过两个怎么办?

约瑟夫·戴格尔评论后编辑:Collection对象的项目都是同一类型,它们是在特定条件下可预订的酒店房间。

Collection<Room> roomsFromA = getRoomsFromA();
Collection<Room> roomsFromB = getRoomsFromB();
for(Room roomA : roomsFromA){
    for(Room roomB : roomsFromB){
        //add roomA and roomB to something, this is not important for what I need
        //the important part is how you handle the part before
        //especially if Collection objects number grows beyond two
    }
}

编辑2:我会尽力解释得更好,很抱歉问题不清楚。下面是一个例子:用户要求入住双人间和单人间。酒店拥有 3 间双人间和 4 间单人间。

我需要将每个“双人间”与每个“单人间”关联起来,这是因为每个房间都有自己的特点,例如互联网、更宜人的景色等等。所以我需要给用户所有的组合让他选择。

这是一个简单的情况,其中只涉及两个 Room 对象的集合,当酒店和用户都可以提供/请求更多房间类型时,您如何处理问题?

有帮助吗?

解决方案

你正在尝试做的,是让从一组Y的选择X的所有可能的排列这是离散数学中的一个众所周知的问题,我认为这只是所谓的组合数学。

要解决你的问题,你需要创建一个包含所有的房间类型超级集合。如果这是一个数组或列表,那么你可以使用这个例子来计算所有可能的从该组Y的例子将给出从列表/阵列的索引选择X的方法。

其他提示

执行集合排队到底是什么?

HashMap map = new HashMap();
for (int i=0; i<c1.Size(); i++) {
   map.put(c1[i], c2[i]);
}

好了,因为我不知道你是否需要寻找两者只有一个,HashMap的将无法工作。

我想创建接收一对类..排序:

private static class Pair<K, T> {
    private K one;
    private T two;

    public Pair(K one, T two) {
        this.one = one;
        this.two = two;
    }

    /**
     * @return the one
     */
    public K getOne() {
        return one;
    }

    /**
     * @return the two
     */
    public T getTwo() {
        return two;
    }
} 

和创建列表与他们。

您例如意味着从“roomsFromB”的返回值是“roomsFromA”的返回值的子集合,所以它会更自然的这种方式进行建模:

class Room {
   public Collection<Room> getRoomsFromB { ... 
}

那么这将让你做的事:

//收集室

for (Room a: rooms)
{ 
   for(Room b a.getRoomsFromB){ ...

这是假设他们分层模型,当然。如果他们不那么这是不恰当的,但后来你问的问题,在我看来,实在是如何将它们之间的关系模型,你还没有做出明确的。

您可能会重新考虑是否需要的正是这种逻辑。你引入为O(n ^ 2)操作,它可以迅速失控。 (在技术上O(MN),但我猜m和n是大致相同的顺序。)

有另一种解决问题了吗?也许可以创建一个“设定”,其包括所有A和所有的B,然后将每个对象A和B可以指向这个集合,而不是

我假设:

  • 中的每个元素 collection 1将匹配一个元素collection 2
  • 收藏的大小相同
  • 可以订购集合,并且订单与两个集合中的每个元素匹配

  1. 通过标识每个对象的属性订购两个集合(按相同顺序)。
  2. 使用单个循环迭代两个集合,构建一个关系对象并将其添加到新集合中。

看看这是否对您有帮助:

public static class Room {
    private int number;
    private String name;

    public Room(int number, String name) {
        super();
        this.number = number;
        this.name = name;
    }

    public int getNumber() {
        return number;
    }

    public String getName() {
        return name;
    }
}

public static class RoomRelation {
    private Room a;
    private Room b;

    public RoomRelation(Room a, Room b) {
        super();
        this.a = a;
        this.b = b;
    }

    public Room getA() {
        return a;
    }

    public Room getB() {
        return b;
    }

    @Override
    public String toString() {
        return a.getName() + "(" + a.getNumber() + ") " + b.getName() + "(" + b.getNumber() + ")";
    }
}

public static void main(String[] args) {

    List<Room> roomsFromA = new ArrayList<Room>();
    List<Room> roomsFromB = new ArrayList<Room>();

    roomsFromA.add(new Room(1,"Room A"));
    roomsFromA.add(new Room(2,"Room A"));

    roomsFromB.add(new Room(1,"Room B"));
    roomsFromB.add(new Room(2,"Room B"));

    Comparator<Room> c = new Comparator<Room>() {
        @Override
        public int compare(Room o1, Room o2) {
            return o1.getNumber() - o2.getNumber();
        } };

    Collections.sort(roomsFromA, c);
    Collections.sort(roomsFromB, c);

    List<RoomRelation> relations = new ArrayList<RoomRelation>();

    for (int i = 0; i < roomsFromA.size(); i++) {
        relations.add(new RoomRelation(roomsFromA.get(i), roomsFromB.get(i)));
    }

    for (RoomRelation roomRelation : relations) {
        System.out.println(roomRelation);
    }
}

您的问题是相当不清楚。据我了解,你想列出的房间,减去重复的所有组合。这里我们一些代码来构建了所有的房间组合的二维数组。有关更多种室,放入另一个嵌套循环。

Collection<Room> roomsFromA = getRoomsFromA();
Collection<Room> roomsFromB = getRoomsFromB();

Room[][] combinations = new Room[roomsFromA .size()][roomsFromB .size()];

int a = 0;
int b = 0;

for(Room roomA : roomsFromA){

   for(Room roomB : roomsFromB){
      combinations [a][b] = [roomA][roomB]; //Build up array
      b++; 
   }
   a++;
}

return combinations;

这是一个常见的问题。这就是所谓的一个笛卡尔乘积。如果你在你的情况下,两个集合的样子,我会毫不犹豫地有两个嵌套循环。否则,请参阅这个问题

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top