كيفية تعيين مؤشر فرزها مرة أخرى إلى المؤشر الأصلي للتحصيل أنا فرز

StackOverflow https://stackoverflow.com/questions/206953

  •  03-07-2019
  •  | 
  •  

سؤال

ولقد حصلت مجموعة (قائمة <مستطيل>) التي أنا بحاجة إلى فرز بين اليسار واليمين. هذا الجزء من السهل. ثم أريد أن تكرار خلال المستطيلات في حياتهم <م> الأصلية أمر ، ولكن تجد بسهولة الرقم القياسي في جمع فرزها. سوف indexOf () لا تعمل، منذ أن كنت قد عددا من الأشياء متساوية. لا يسعني الشعور هناك يجب أن يكون وسيلة سهلة للقيام بذلك.

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

المحلول 2

ولقد وجدت الحل - ولكن ربما يكون هناك أكثر إتقانا / أكثر الأمثل واحد هناك

List<Rectangle> originalRects = ...;

/* record index of each rectangle object.
 * Using a hash map makes lookups efficient,
 * and using an IdentityHashMap means we lookup by object identity
 * not value.
 */
IdentityHashMap<Rectangle, Integer> originalIndices = new IdentityHashMap<Rectangle, Integer>();
for(int i=0; i<originalRects.size(); i++) {
    originalIndices.put(originalRects.get(i), i);
}

/* copy rectangle list */
List<Rectangle> sortedRects = new ArrayList<Rectangle>();
sortedRects.addAll(originalRects);

/* and sort */
Collections.sort(sortedRects, new LeftToRightComparator());

/* Loop through original list */
for(int i=0; i<sortedRects.size(); i++) {
    Rectangle rect = sortedRects.get(i);
    /* Lookup original index efficiently */
    int origIndex = originalIndices.get(rect);

    /* I know the original, and sorted indices plus the rectangle itself */
...

نصائح أخرى

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

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

وهناك طريقة أخرى لفرز مجموعة من الأرقام القياسية بدلا من فرز القائمة الأصلية. تبدأ مجموعة كصفيف هوية [0] = 0، و[1] = 1، الخ، ثم استخدام مخصص مقارنة / نوع للحصول على مجموعة المؤشر. لا تتطلب الكثير من مساحة إضافية، كما أنك لا تملك إلا مجموعة إضافية من الأعداد الصحيحة بدلا من مجموعة أخرى.

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