سؤال

لدي كائنات مجموعتين، أريد أن ربط كل كائن هذين في طريقة قابلة للقراءة (Hashmap، الكائن الذي تم إنشاؤه عن قصد، تختار).

كنت أفكر في حلقتين متداخلة في الآخر، لكن ربما تكون مشكلة معروفة ولديها حل شائع مفهوم ...

ماذا لو ارتفع عدد كائنات المجموعة فوق اثنين؟

تحرير بعد 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 غرف مفردة.

أحتاج إلى ربط كل "غرفة مزدوجة" لكل "غرفة مفردة"، وذلك لأن كل غرفة لديها خصوصية لها يقول الإنترنت، وجهة نظر أكثر متعة، وهلم جرا. لذلك أحتاج إلى إعطاء المستخدم جميع المجموعات للسماح له بالاختيار.

هذه هي الحالة البسيطة، حيث تشارك اثنين فقط من مجموعتين من كائنات الغرفة، كيف يمكنك إدارة المشكلة عند القول أن كل من الفندق والمستخدم يمكن أن يقدم / طلب المزيد من أنواع الغرف؟

هل كانت مفيدة؟

المحلول

ما تحاول القيام به هنا هو الحصول على جميع التباديل الممكنة للاطلاع على X من مجموعة من Y. هذه مشكلة معروفة في الرياضيات المنفصلة وأعتقد أنه يطلق عليه فقط الرياضيات الرياضيات.

لحل مشكلتك، تحتاج إلى إنشاء مجموعة فائقة تحتوي على جميع أنواع غرفتك. إذا كانت هذه صفيف أو قائمة يمكنك استخدامها هذا المثال لحساب جميع الطرق الممكنة للاطلاع على X من مجموعة Y.، سيمنحك المثال المؤشرات من القائمة / الصفيف.

نصائح أخرى

هل يصطف المجموعات بالضبط؟

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

حسنا، نظرا لأنني لا أعرف إذا كنت ستحتاج إلى البحث عن كل منهما، فلن يعمل 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;
    }
} 

وإنشاء قائمة معهم.

يجب أن يكون مثالك أن قيمة الإرجاع من "Room Roomfromb" هي Subcollection لقيمة الإرجاع "Roomsfroma"، لذلك سيكون أكثر طبيعية لنموذجها بهذه الطريقة:

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

والتي من شأنها بعد ذلك القيام به:

// الغرف جمع

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

هذا يفترض أنهم على غرار التسلسل الهرمي، بالطبع. إذا لم يكن الأمر غير مناسب، ولكن بعد ذلك، فإن السؤال الذي تطرحه، يبدو لي، هو حقا كيفية طراز العلاقة بينهما، وأنت لم تقم بذلك بشكل صريح.

قد تقوم بإعادة النظر في ما إذا كنت بحاجة إلى هذا المنطق بالضبط. أنت تقدم عملية O (n ^ 2)، والتي يمكن أن تخرج بسرعة من اليد. (من الناحية الفنية (MN)، لكنني أظن أن M و N أشعر بنفس الترتيب تقريبا.)

هل هناك حل آخر مشكلتك؟ ربما يمكنك إنشاء "مجموعة" والتي تتضمن كل من A و All من 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);
    }
}

سؤالك غير واضح تماما. كما أفهم أنك تريد سرد جميع مجموعات الغرف، ناقص التكرارات. هنا لنا بعض الكود لبناء مجموعة ثنائية الأبعاد من جميع مجموعات الغرف. لمزيد من أنواع الغرفة، وضعت في حلقة أخرى متداخلة.

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;

إنها مشكلة شائعة. يطلق عليه المنتج الديكارتي. وبعد إذا كان لديك مجموعتان مثل في قضيتك، فلن أتردد في الحصول على حلقتين متداخيتين. خلاف ذلك، انظر هذا السؤال.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top