문제

나는 두 개의 수집 객체가 있는데,이 두 가지의 각 객체를 읽을 수있는 방식으로 연관시키고 싶습니다 (해시 맵, 의도적으로 생성 된 객체, 선택).

나는 하나의 루프를 다른 루프에 생각하고 있었지만 아마도 잘 알려진 문제이며 일반적으로 이해할 수있는 솔루션이 있습니다 ...

수집 객체의 수가 두 개 이상으로 올라가면 어떻게됩니까?

편집 Joseph Daigle 의견 : 컬렉션 개체의 항목은 모두 같은 유형이며 특정 조건에서 예약 가능한 호텔의 방입니다.

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 개의 싱글 룸이 있습니다.

나는 모든 "더블 룸"을 모든 "싱글 룸"과 연관시켜야합니다. 이것은 각 객실에 고유 한 특이성이 있기 때문에 인터넷, 더 즐거운 전망 등이 있기 때문입니다. 그래서 나는 그를 선택할 수 있도록 모든 조합을 사용자에게 제공해야합니다.

이것은 두 개의 방 개체 만 관여하는 간단한 경우입니다. 호텔과 사용자가 더 많은 객실 유형을 제공 / 요청할 수 있다고 말할 때 어떻게 문제를 관리합니까?

도움이 되었습니까?

해결책

당신이 여기서하려는 것은 Y 세트에서 X를 선택하는 가능한 모든 순열을 얻는 것입니다. 이것은 개별 수학에서 잘 알려진 문제이며, 그것이 조합 수학이라고도합니다.

문제를 해결하려면 모든 객실 유형이 포함 된 슈퍼 컬렉션을 만들어야합니다. 이것이 배열 또는 목록 인 경우 사용할 수 있습니다. 이 예 Y 세트에서 x를 선택하는 모든 가능한 방법을 계산하려면 예제는 목록/배열의 지수를 제공합니다.

다른 팁

컬렉션이 정확히 일치합니까?

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

글쎄, 나는 당신이 하나만 가지고 있으면 두 가지를 검색 해야하는지 모르겠으므로 해시 맵은 작동하지 않습니다.

나는 쌍을받는 수업을 만들 것입니다 .. 일종의 :

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

귀하의 질문은 매우 불분명합니다. 내가 이해하는 것처럼, 당신은 객실의 모든 조합을 나열하고, 마이너스 복제물을 나열하고 싶다. 여기에 우리는 모든 객실 조합의 2D 배열을 구축하기위한 코드입니다. 더 많은 종류의 방을 위해서는 또 다른 중첩 루프를 넣으십시오.

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;

일반적인 문제입니다. a라고합니다 데카르트 제품. 귀하의 경우와 같이 두 개의 컬렉션이 있다면, 나는 두 개의 중첩 루프를 주저하지 않을 것입니다. 그렇지 않으면 참조하십시오 이 질문.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top