Frage

Ich habe zwei Sammlung Objekte, ich jedes Objekt dieser beiden in einer lesbaren Weise zugeordnet werden soll (HashMap, Objekt absichtlich geschaffen, die Sie wählen).

Ich dachte an zwei Schleifen ineinander verschachtelt, aber vielleicht ist es ein bekanntes Problem und hat eine allgemein verständliche Lösung ...

Was passiert, wenn die Anzahl der Sammlung Objekte wirft über zwei?

EDIT nach Joseph Daigle Kommentar: Die Elemente der Sammlung Objekte sind alle vom gleichen Typ sind sie Zimmer Hotels gefunden buchbar unter bestimmten Bedingungen sein

.
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: Ich werde versuchen, es besser, sorry für die Frage zu erklären, unklar zu sein. Folgt ein Beispiel: Ein Benutzer fordert für einen Doppel- und ein Einzelzimmer. Das Hotel verfügt über 3 Doppelzimmer und 4 Einzelzimmer zur Verfügung.

Ich brauche jedes „Doppelzimmer“ für jedes „Einzelzimmer“ zu assoziieren, ist dies, weil jedes Zimmer hat seine eigene Besonderheit sagt Internet hat, eine angenehmere Sicht, und so weiter. Also muss ich den Benutzer geben, alle Kombinationen zu lassen, ihn wählen.

Dies ist der einfache Fall, in dem nur zwei Sammlung von Raum-Objekte beteiligt sind, wie schaffen Sie das Problem sagen, wenn beide Hotel und Benutzer anbieten kann / mehr Zimmertypen anfordern?

War es hilfreich?

Lösung

Dies ist ein bekanntes Problem in der diskreten Mathematik

Was Sie versuchen, hier zu tun ist, alle möglichen Permutationen zu bekommen X aus einem Satz von Y. von der Wahl und ich denke, es ist nur Combinatorial Mathematik genannt.

Zur Lösung Ihres Problems benötigen Sie eine Super-Sammlung erstellen alle Zimmerarten enthält. Ist dies ein Array oder eine Liste Sie dann dieses Beispiel alle möglichen berechnen Wegen der X aus dem Satz von Y. Auswahl Das Beispiel Sie die Indizes aus der Liste / Array geben wird.

Andere Tipps

Haben die Sammlungen genau ausrichten?

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

Nun, da ich weiß nicht, ob Sie nur eine für beide von ihnen haben suchen müssen, die HashMap wird nicht funktionieren.

Ich würde eine Klasse erstellen, die ein Paar erhält .. Art:

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

und erstellen Sie eine Liste mit ihnen.

Ihr Beispiel bedeutet, dass der Rückgabewert von „roomsFromB“ ist eine Teilsammlung des Rückgabewertes von „roomsFromA“, so würde es natürlich sein, um es auf diese Weise zu modellieren:

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

die dann würden Sie tun:

// Sammlung Zimmer

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

Das setzt voraus, dass sie hierarchisch modelliert ist, natürlich. Wenn sie nicht dann diese nicht geeignet ist, dann aber die Frage Sie fragen, so scheint es mir, ist wirklich, wie die Beziehung zwischen ihnen zu modellieren, und Sie haben noch nicht das explizit gemacht.

Sie könnten überlegen, ob Sie brauchen genau diese Logik. Sie sind die Einführung eines O (n ^ 2) Operation, die aus der Hand schnell bekommen kann. (Technisch O (mn), aber ich vermute, m und n ist in etwa die gleiche Reihenfolge.)

Gibt es eine andere Lösung für Ihr Problem? Vielleicht könnten Sie ein ‚Set‘ erstellen, die alle A und alle B enthält, und dann jedes Objekt in A und B zu diesem Set zeigen könnte, statt?

Ich gehe davon aus, dass:

  • Jedes Element in collection 1 wird entsprechen ein einzelnes Element in collection 2
  • Die Sammlungen haben die gleiche Größe
  • können die Kollektionen bestellt werden und die Reihenfolge übereinstimmt, jedes Element in beide Sammlungen

  1. Um beiden Sammlungen (in den gleichen Reihenfolge) durch die Eigenschaft, dass identifiziert jedes Objekt.
  2. beiden Sammlungen mit einer einzigen Schleife einer Iteration durch, eine Beziehung Objekt bauen und sie in eine neue Sammlung.

Sehen Sie, wenn dies hilft Ihnen:

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

Ihre Frage ist ziemlich unklar. Wie ich verstehe Sie alle Kombinationen der Zimmer auflisten möchten, minus Duplikate. Hier haben wir einige Code ein 2D-Array aller Raumkombinationen aufzubauen. Weitere Arten von Raum, in einer anderen verschachtelten Schleife setzen.

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 ist ein weit verbreitetes Problem. Es ist ein cartesianischen Produkt genannt. Wenn Sie wie in Ihrem Fall zwei Sammlungen haben, würde ich nicht zögern, zwei verschachtelte Schleifen zu haben. Ansonsten finden Sie unter diese Frage .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top