سؤال

private HashMap<DataObject, HashSet> AllDataObjects;

...

/** Returns all DataObject elements that are NOT in the specified set. */
private DataObject[] invert( HashSet<DataObject> set )
{
    HashSet<DataObject> keys = (HashSet) AllDataObjects.keySet();
    keys = (HashSet) keys.clone();

    keys.removeAll( set );

    return (DataObject[]) keys.toArray();
}

لاحظ أنني لا أريد تغيير AllDataObjects من خلال هذه العملية. لقد أفسدت مجموعة من AllDataObjectsمفاتيح (التي هي DataObjectاريد set المعلمة لطرح من) في HASHST لاستخدام استنساخ، والتي من المفترض إرجاع نسخة ضحلة يمكنني بعد ذلك set من دون التأثير AllDataObjects.

هل هذا ينظر إليك؟

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

المحلول

إنشاء مجموعة جديدة وإعطاء واحد يتم استنساخه كوسيطة. هذا يتجنب الصب وهكذا لا تفقد الأطفال.

private DataObject[] invert( Set<DataObject> set ){
    Set<DataObject> keys = new HashSet<DataObject>(AllDataObjects.keySet());
    keys.removeAll( set );
    return keys.toArray(new DataObject[]{});
}

تجدر الإشارة أيضا إلى أنه يجب عليك استخدام مجموعة بدلا من Hashset للمعلمة حتى لا تكون عبء عملائك بشكل مفرط.

نصائح أخرى

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

أعتقد أن هذا الرابط لديه طريقة أفضل لكتابة هذه الطريقة إذا كان يجب عليك:

جافا: هل هناك طريقة سهلة أو سريعة إلى حد ما، أو، أو، أو XOR معا مجموعات؟

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