Pergunta

Eu tenho objetos dois coleção, quero associar cada objeto destes dois de forma legível (HashMap, objeto criado de propósito, você escolhe).

Eu estava pensando em dois loops um aninhado no outro, mas talvez seja um problema bem conhecido e tem uma solução comumente compreensível ...

E se o número de coleção objetos aumentos acima de dois?

Editar após comentário Joseph Daigle: Os itens dos objetos da coleção são todos do mesmo tipo, eles são quartos de hotéis encontrado para ser reservado sob certas condições

.
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: Eu vou tentar explicar melhor, desculpe pela questão de ser clara. Segue um exemplo: Um usuário solicita para um casal e um quarto individual. O hotel tem 3 duplos e 4 quartos individuais disponíveis.

Eu preciso associar cada "quarto duplo" para cada "quarto individual", isto é porque cada quarto tem a sua própria internet peculiaridade digamos, uma visão mais agradável, e assim por diante. Então, eu preciso dar ao usuário todas as combinações para deixá-lo escolher.

Este é o caso simples, em que apenas dois Coleção de objetos do quarto estão envolvidos, como você gerenciar o problema quando dizem ambos hotel e usuário pode oferecer / pedido mais tipos de quartos?

Foi útil?

Solução

O que você está tentando fazer aqui é fazer com que todas as permutações possíveis de escolher X a partir de um conjunto de Y. Este é um problema bem conhecido na matemática discreta e eu acho que é simplesmente chamado de Combinatória Matemática.

Para resolver o seu problema, você precisa criar um super coleção contendo todos os seus tipos de quartos. Se esta for uma matriz ou uma lista que você pode usar este exemplo para calcular todas as possíveis formas de escolher X do conjunto de Y. o exemplo vai lhe dar os índices da lista / matriz.

Outras dicas

Siga as coleções alinhar exatamente?

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

Bem, desde que eu não sei se você vai precisar de pesquisa para ambos tendo apenas um, o HashMap não vai funcionar.

Gostaria de criar uma classe que recebe um par .. tipo 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;
    }
} 

e criar uma lista com eles.

Seu exemplo implica que o valor de retorno de "roomsFromB" é um subcoleção do valor de retorno de "roomsFromA", de modo que seria mais natural para modelar-lo dessa forma:

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

que seria então deixá-lo fazer:

// quartos Colecção

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

Isso supõe que eles são modelados de forma hierárquica, é claro. Se eles não estão, então esta é impróprio, mas então a pergunta que você está pedindo, parece-me, é realmente como modelar a relação entre eles, e você ainda não fez isso explícito.

Você pode reconsiderar se você precisa exatamente essa lógica. Você está introduzindo um O (n ^ 2) operação, que pode rapidamente sair da mão. (Tecnicamente O (mn), mas eu estou supondo que m e n são aproximadamente da mesma ordem.)

Existe uma outra solução para o seu problema? Talvez você poderia criar um 'set', que inclui todos Um e todos B, e, em seguida, cada objeto em A e B poderia apontar para este conjunto, em vez disso?

Eu assumo que:

  • Cada elemento collection 1 vontade coincidir com um único elemento em collection 2
  • As coleções têm o mesmo tamanho
  • As coleções podem ser encomendados e a ordem corresponde em cada elemento ambas as coleções

  1. Order ambas as coleções (na mesma ordem) pela propriedade que identifica cada objeto.
  2. Iterate através de ambas as coleções com um único loop, construir um objeto relação e adicioná-lo para uma nova coleção.

Veja se isso ajuda você:

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

A sua pergunta é bastante clara. Pelo que entendi você deseja listar todas as combinações de quartos, menos duplicatas. Aqui nós algum código para construir uma matriz 2d de todas as combinações de quartos. Para mais tipos de quarto, colocar em outro loop aninhado.

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;

É um problema comum. É chamado um cartesiana produto . Se você tem duas coleções como no seu caso, eu não hesitaria em ter dois loops aninhados. Caso contrário, consulte esta questão .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top