أي نوع كائن Java (مجموعة/قائمة/مجموعة/أيا كان) الذي أريده لهذا؟

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

سؤال

أرغب في تخزين مجموعة من الكائنات التي يتم وضعها على أساس القيمة التي يمثلونها. هذه المفاتيح يستطيع تتكرر. على سبيل المثال:

 [4] => Bob
 [5] => Mary
 [5] => Sue
 [9] => Steve
[10] => Jason
[10] => Michelle

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

أنا لست مقتنعًا بالطريقة التي أحاول أن أتناول بها هذا هو أفضل طريقة ، لذلك أنا منفتح على التعليقات أيضًا.

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

المحلول

كنت ترغب في multimap. الجوافة يوفر هذه الواجهة ومختلف المساحات الفرعية مثل ListMultimap, SetMultimap و SortedSetMultimap اعتمادًا على نوع المجموعة التي تريد تخزين القيم فيها. ثم يوفر تطبيقات مختلفة مثل ArrayListMultimap و HashMultimap, ، بالإضافة إلى العديد من المواقف للاستخدام معهم في الورم المتعدد.

الطريقة التقليدية للقيام بذلك في جافا هي شيء مثل Map<K, List<V>>, Map<K, Set<V>> وما إلى ذلك ، ولكن الحفاظ على مجموعات القيم أمر مملة وعمليات مختلفة يجب أن تكون بسيطة (مثل وضع قيمة للمفتاح) أكثر تعقيدًا مما يجب أن تكون.

Multimap المقصود كهيكل بيانات مصمم خصيصًا لتصميم قيم متعددة تم تعيينها إلى مفتاح واحد (على عكس Map). بالنظر إلى ذلك ، فإنه يجعل العمليات بسيطة كما تتوقع:

ListMultimap<Integer, String> m = ArrayListMultimap.create();
m.put(4, "Bob");
m.put(5, "Mary");
m.put(5, "Sue");
...

for (String name : m.get(5)) { ... } // iterates ["Mary", "Sue"]

إذا كنت ترغب في التأكد من عدم تعيين نفس القيمة لمفتاح واحد مرتين ولا تهتم بالترتيب الذي يوجد فيه القيم ، فيمكنك استخدام أ SetMultimap بدل من ListMultimap, ، إلخ.

لست متأكدًا مما تعنيه فيما يتعلق بـ "هل هناك كائن آخر يكون مفتاحه في حدود 1 من المفتاح الحالي؟ إذا كان الأمر كذلك ، فطاردها وإزالتها من المجموعة." ولكن إذا قرأته بشكل صحيح ، فيمكنك فعل شيء مثل هذا:

for (Integer key : m.keySet()) {
  Collection<String> people = m.get(key);
  Collection<String> peopleOneLower = m.get(key - 1); // empty if there are none
  ...
}

بدلاً من ذلك ، يمكنك أن تفعل شيئًا مع TreeMultimap<Integer, String> والتي سيكون لها كل من مجموعة المفاتيح ومجموعات القيمة.

نصائح أخرى

ماذا عن Map<Integer, List<String>>, ، بطريقة تجنب التصادم. سوف يغير مجموعة البيانات الخاصة بك لتبدو مثل:

 [4] => [Bob]
 [5] => [Mary, Sue]
 [9] => [Steve]
[10] => [Jason, Michelle]

سيكون عليك تغيير رمز Iterator الخاص بك قليلاً. يمكنك استخدام فهارس List عناصر مثل "مفاتيحها" ، وبالطبع عليك إضافة منطق لتهيئة الخاص بك Map مع قوائم فارغة أو تأكد من التحقق من Map القيم ل null. سوف يعتمد نوعًا ما على كيفية توليدك Map.

ماذا عن شيء مثل:

IDictionary<int,IList<Person>> 

لا بد لي من المشرف ، لا أتابع 100 ٪ منطق العمل ، ولكن إذا كان بإمكانك الحصول على قيم متعددة لمفتاح واحد ، فيجب أن يدعمه شيء من هذا القبيل.

- لذلك ، الاستجابة مع:

Map<Integer, List<String>>

هو أكثر ملاءمة بكثير.

ربما مجرد شيء مثل: قائمة حيث يحتوي CustomObject على مفتاحك وقيمتك وفرز القائمة حسب المفتاح.

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

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