java - مجموعة جافا الإبقاء على النظام؟




set order (11)

لا يفترض Iterator التي تم إرجاعها بواسطة Set بإرجاع البيانات بطريقة Ordered. راجع java.util.Iterators جهازي إلى نفس المجموعة: هل يجب عليهم إرجاع العناصر بنفس الترتيب؟

هل هناك مجموعة جافا تحتفظ بالطلب؟ تقوم إحدى الطريقتين بإرجاع مجموعة معي ومن المفترض أن يتم ترتيب البيانات ولكن مع تكرارها على المجموعة ، فإن البيانات غير مرتبة. هل هناك طريقة أفضل لإدارة هذا؟ هل يجب تغيير الطريقة لإرجاع شيء آخر غير المجموعة؟


المجموعة هي مجرد واجهة. لكي تحتفظ بالطلب ، يجب عليك استخدام تنفيذ محدد لتلك الواجهة والواجهة الفرعية SortedSet ، على سبيل المثال TreeSet أو LinkedHashSet. يمكنك لف الخاص بك تعيين بهذه الطريقة:

Set myOrderedSet = new LinkedHashSet(mySet);

لا تحتفظ المجموعة عادةً بالترتيب ، مثل HashSet من أجل العثور بسرعة على عنصر emelent ، ولكن يمكنك محاولة LinkedHashSet الاحتفاظ بالترتيب الذي قمت بوضعه فيه.


كما اقترح العديد من الأعضاء استخدام LinkedHashSet للاحتفاظ بأمر المجموعة. يمكن لـ U التفاف المجموعة باستخدام هذا التنفيذ.

يمكن استخدام تطبيق SortedSet لترتيب مفرز ولكن لغرضك استخدام LinkedHashSet .

أيضًا من المستندات

"هذا التطبيق ينقص عملائه من الترتيب العشوائي غير المحدد الذي يوفره HashSet ، دون تكبد التكلفة المتزايدة المرتبطة بـ TreeSet. يمكن استخدامه لإنتاج نسخة من مجموعة لها نفس ترتيب الأصل ، بغض النظر عن الأصل تنفيذ المجموعة: "

المصدر: LinkedHashSet



فقط SortedSet يمكن أن تفعل ترتيب Set


لا توفر واجهة Set أي ضمانات طلب.

تمثل الواجهة الفرعية ، SortedSet ، مجموعة يتم فرزها وفقًا SortedSet معينة. في Java 6 ، توجد SortedSet بتنفيذ SortedSet . هم TreeSet و ConcurrentSkipListSet .

بالإضافة إلى واجهة SortedSet ، هناك أيضًا فئة LinkedHashSet . يتذكر الترتيب الذي تم فيه إدراج العناصر في المجموعة ، وإرجاع عناصرها بهذا الترتيب.


في ما يلي ملخص سريع لخصائص ترتيب تطبيقات Set القياسية المتوفرة في جافا:

  1. الحفاظ على ترتيب الإدراج: LinkedHashSet و CopyOnWriteArraySet (مؤشر ترابط آمن)
  2. إبقاء العناصر مرتبة داخل المجموعة: TreeSet و EnumSet (خاص بـ enums) و ConcurrentSkipListSet (مؤشر ترابط آمن)
  3. لا تحتفظ بالعناصر بأي ترتيب محدد: HashSet (الشخص الذي جربته)

للحالة الخاصة بك ، يمكنك فرز العناصر أولاً ثم استخدام أي من 1 أو 2 (على الأرجح LinkedHashSet أو TreeSet ). أو بدلاً من ذلك وبكفاءة أكبر ، يمكنك فقط إضافة البيانات التي لم يتم فرزها إلى TreeSet والتي TreeSet بالفرز تلقائيًا نيابةً عنك.


للاحتفاظ LinkedHashSet استخدام الأمر أو LinkedHashSet .


يعد LinkedHashSet إصدارًا مرتبة من HashSet يحتفظ بقائمة مرتبطة بشكل مضاعف عبر كافة العناصر. استخدم هذا الصنف بدلاً من HashSet عندما تهتم بترتيب التكرار.


ظننت أنني سأساهم بهذه الإجابة لإضافة المزيد من التفاصيل من المواصفات.

أولاً ، ما الفرق بين تمرير المرجع وتجاوز القيمة؟

يعني التمرير حسب المرجع أن معلمة الدالات المسماة هي نفس المتغير الذي تم تمريره للمتصلين (وليس القيمة ، ولكن الهوية - المتغير نفسه).

تعني القيمة Pass بالقيمة أن معلمة functions المسماة ستكون نسخة من وسيطة تم تمريرها للمتصلين.

أو من ويكيبيديا ، حول موضوع التمرير

في التقييم حسب كل استدعاء (يشار إليه أيضًا بالمرجعية) ، تستلم الدالة إشارة ضمنية إلى متغير يستخدم كوسيطة ، بدلاً من نسخة من قيمته. ويعني هذا عادة أن الوظيفة يمكن أن تعدل (أي تعين إلى) المتغير المستخدم كحجة - وهو أمر سيشاهده المتصل.

وحول موضوع التمريرات

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

ثانيا ، نحن بحاجة إلى معرفة ما يستخدم جافا في استدعائها الأسلوب. و لغة جافا مواصفات الدول

عندما يتم استدعاء الأسلوب أو المُنشئ (الفقرة 12.12) ، تشرع قيم تعبيرات الوسيطة الفعلية متغيرات المعلمات الناشئة حديثًا ، كل من النوع المعلن ، قبل تنفيذ نص الأسلوب أو المُنشئ.

لذلك يعين (أو يربط) قيمة الوسيطة إلى متغير المعلمة المطابق.

ما هي قيمة الحجة؟

دعونا نعتبر أنواع المرجع ، تنص مواصفات Java Virtual Machine

هناك ثلاثة أنواع من أنواع المرجع : أنواع الفئات وأنواع الصفيف وأنواع الواجهة. القيم الخاصة بهم هي مراجع إلى مثيلات الفئة أو المصفوفات أو المصفوفات الفئوية التي تم إنشاؤها ديناميكيًا والتي تقوم بتطبيق الواجهات على التوالي.

تنص مواصفات لغة Java أيضاً

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

قيمة الوسيطة (من نوع المرجع) هي مؤشر إلى كائن. تجدر الإشارة إلى أن المتغير ، والاحتفاظ بأحد الأساليب بنوع الإرجاع المرجعي ، وتعبير إنشاء مثيل ( new ...) كل ذلك يتم تحليله إلى قيمة نوع مرجع.

وبالتالي

public void method (String param) {}
...
String var = new String("ref");
method(var);
method(var.toString());
method(new String("ref"));

كل ذلك يربط قيمة مرجع إلى Stringمثيل لمعلمة الطريقة التي تم إنشاؤها حديثًا ، param. هذا هو بالضبط ما يصفه تعريف القيمة بالقيمة. على هذا النحو ، جافا هي التي تمر بمرور الوقت .

حقيقة أنه يمكنك اتباع المرجع لاستدعاء طريقة أو الوصول إلى حقل كائن المشار إليه غير متصل بالمحادثة تمامًا. كان تعريف المرور بالمرور

ويعني هذا عادة أن الوظيفة يمكن أن تعدل (أي تعين إلى) المتغير المستخدم كحجة - وهو أمر سيشاهده المتصل.

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

يتم تعريف القيم الأولية في مواصفات Java Virtual Machine ، here . قيمة النوع هي قيمة النقطة المتكاملة أو العائمة المطابقة ، والمشفرة بشكل مناسب (8 ، 16 ، 32 ، 64 ، إلخ).





java set order