Pregunta

Tengo dos objetos Collection, quiero asociar cada objeto de estos dos en una forma legible (HashMap, objeto creado a propósito, usted elige).

Yo estaba pensando en dos bucles anidados uno dentro del otro, pero tal vez es un problema bien conocido y tiene una solución comúnmente comprensible ...

¿Qué pasa si el número de objetos Colección eleva por encima de dos?

Edición después comentario Joseph Daigle: Los elementos de los objetos de la colección son todos del mismo tipo, que son las habitaciones de los hoteles que se encuentran a estar disponible bajo ciertas condiciones

.
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
    }
}

EDIT 2: Voy a tratar de explicar mejor, lo siento por la pregunta no está clara. Sigue un ejemplo: Un usuario solicita para una doble y una habitación individual. El hotel cuenta con 3 dobles y 4 habitaciones individuales disponibles.

Tengo que asociar cada "habitación doble" para cada "habitación individual", esto es debido a que cada habitación tiene su propia peculiaridad decir Internet, una vista más agradable, y así sucesivamente. Por eso es necesario para dar al usuario todas las combinaciones para dejarle elegir.

Este es el caso sencillo, en el que están involucrados sólo dos Colección de objetos de la habitación, ¿cómo manejar el problema cuando dicen que tanto el hotel como el usuario pueden ofrecer / Más tipos de habitación?

¿Fue útil?

Solución

Lo que estamos tratando de hacer aquí es conseguir que todas las permutaciones posibles de la elección de X a partir de un conjunto de Y. Este es un problema bien conocido en matemáticas discretas y creo que simplemente se llama combinatorias Matemáticas.

Para resolver el problema es necesario crear una colección súper que contiene todos sus tipos de habitación. Si se trata de una matriz o una lista a continuación, puede utilizar este ejemplo para calcular todas las posibles formas de elegir X a partir del conjunto de Y. el ejemplo le dará los índices de la lista / matriz.

Otros consejos

¿Las colecciones se alinean exactamente?

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

Bueno, ya que no sé si tendrá que buscar tanto de ellos que tienen sólo uno, el HashMap no funcionará.

Me gustaría crear una clase que recibe un par .. especie de:

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;
    }
} 

y crear una lista con ellos.

Su ejemplo implica que el valor de retorno de "roomsFromB" es una subcolección del valor de retorno de "roomsFromA", por lo que sería más natural para modelar de esta manera:

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

que luego permitirá hacer:

// habitaciones Collection

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

Esto es suponiendo que están modelados jerárquicamente, por supuesto. Si no están, entonces éste es inadecuado, pero entonces la pregunta que estás haciendo, me parece, es realmente cómo modelar la relación entre ellos, y que todavía no ha hecho que explícita.

Es posible que reconsiderar si necesita exactamente esta lógica. Usted está introduciendo un (n ^ 2) la operación, O que puede salir rápidamente de la mano. (Técnicamente O (mn), pero supongo m y n son aproximadamente del mismo orden.)

¿Hay alguna otra solución a su problema? Tal vez podría crear un 'conjunto' que incluye todos los A y todas las habitaciones, y luego cada objeto en A y B podría apuntar a este conjunto, en lugar?

Asumo que:

  • Cada elemento de collection 1 se coincidir con un único elemento en collection 2
  • Las colecciones tienen el mismo tamaño
  • Las colecciones se puede activar y el orden coincide con cada elemento de ambas colecciones

  1. pedido ambas colecciones (en la misma orden) por la propiedad de que identifica cada objeto.
  2. Iterar a través de ambas colecciones con un solo bucle, construir un objeto de relación y añadirlo a una nueva colección.

A ver si esto le ayuda a:

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);
    }
}

Su pregunta es muy clara. Según tengo entendido desea enumerar todas las combinaciones de las habitaciones, menos duplicados. nosotros aquí algo de código para construir una matriz 2D de todas las combinaciones de las habitaciones. Para más tipos de habitación, poner en otro bucle anidado.

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;

Es un problema común. Se llama . Si tiene dos colecciones como en su caso, yo no dudaría en tener dos bucles anidados. De lo contrario, ver esta pregunta .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top