1

2 つの Collection オブジェクトがあり、これら 2 つの各オブジェクトを読み取り可能な方法で関連付けたい (HashMap、意図的に作成されたオブジェクト、選択)。

2 つのループが入れ子になっていることを考えていましたが、それはよく知られた問題であり、一般的に理解できる解決策があるのか​​もしれません...

Collection オブジェクトの数が 2 を超えた場合はどうなるでしょうか?

ジョセフ・デイグルのコメント後に編集: コレクション オブジェクトのアイテムはすべて同じタイプで、特定の条件下で予約できることが判明したホテルの部屋です。

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 オブジェクトの 2 つの Collection のみが関係しています。ホテルとユーザーの両方がより多くの Room タイプを提供/リクエストできるとしたら、どのように問題を管理しますか?

4

8 に答える 8

1

ここでやろうとしているのは、一連の Y から X を選択するすべての可能な順列を取得することです。これは、離散数学ではよく知られている問題であり、単に組み合わせ数学と呼ばれていると思います。

問題を解決するには、すべてのルーム タイプを含むスーパー コレクションを作成する必要があります。これが配列またはリストの場合、この例を使用て、Y のセットから X を選択するすべての可能な方法を計算できます。この例では、リスト/配列からインデックスが得られます。

于 2009-05-26T15:25:50.837 に答える
0

コレクションは正確に並んでいますか?

HashMap map = new HashMap();
for (int i=0; i<c1.Size(); i++) {
   map.put(c1[i], c2[i]);
}
于 2009-05-26T14:37:58.093 に答える
0

あなたの質問はかなり不明確です。私が理解しているように、重複を除いたすべての部屋の組み合わせをリストしたいと考えています。ここでは、すべての部屋の組み合わせの 2 次元配列を作成するコードをいくつか示します。より多くの種類の部屋については、別のネストされたループに入れます。

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;
于 2009-05-26T15:13:23.890 に答える
0

ええと、1 つしかない場合に両方を検索する必要があるかどうかわからないので、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;
    }
} 

そして、それらを使用してリストを作成します。

于 2009-05-26T14:45:04.897 に答える
0

あなたの例は、「roomsFromB」からの戻り値が「roomsFromA」の戻り値のサブコレクションであることを意味するため、そのようにモデル化する方が自然です。

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

次に、次のことができます。

//コレクションルーム

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

もちろん、これはそれらが階層的にモデル化されていることを前提としています。そうでない場合、これは不適切ですが、あなたが尋ねている質問は、実際にはそれらの間の関係をどのようにモデル化するかということであり、あなたはまだそれを明示していません.

于 2009-05-26T14:52:33.557 に答える
0

私はそれを仮定します:

  • 1 の各要素は2collectionの 1 つの要素と一致します collection
  • コレクションは同じサイズです
  • コレクションは順序付けでき、順序は両方のコレクションの各要素と一致します

  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);
    }
}
于 2009-05-26T14:54:54.817 に答える
0

このロジックが正確に必要かどうかを再検討する必要があります。O(n^2) 操作を導入していますが、これはすぐに手に負えなくなります。(技術的には O(mn) ですが、m と n はほぼ同じ順序であると推測しています。)

あなたの問題に対する別の解決策はありますか?おそらく、A のすべてと B のすべてを含む「セット」を作成し、代わりに A と B の各オブジェクトがこのセットを指すことができるでしょうか?

于 2009-05-26T14:59:00.767 に答える
-1

これはよくある問題です。これはデカルト積と呼ばれます。あなたの場合のように 2 つのコレクションがある場合、ネストされた 2 つのループを持つことを躊躇しません。それ以外の場合は、この質問を参照してください。

于 2009-05-26T15:20:10.973 に答える