سؤال

ما هو الفرق الأساسي بين Set<E> و List<E> واجهات؟

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

المحلول

List هو تسلسل مرتب للعناصر بينما Set هي قائمة متميزة من العناصر غير مرتبة (شكرًا لك، كوين تايلور).

List<E>:

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

Set<E>:

مجموعة لا تحتوي على عناصر مكررة.بشكل أكثر رسمية ، لا تحتوي المجموعات على أي زوج من العناصر E1 و E2 بحيث e1.equals (e2) ، وعنصر فارغ واحد على الأكثر.كما هو ضمني باسمها ، فإن هذه الواجهة نماذج التجريد الرياضية.

نصائح أخرى

╔═══════════════════╦══════════════════════╦═════════════════════════════╗
║                   ║         List         ║            Set              ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║     Duplicates    ║          YES         ║            NO               ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║       Order       ║       ORDERED        ║  DEPENDS ON IMPLEMENTATION  ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║ Positional Access ║         YES          ║            NO               ║ 
╚═══════════════════╩══════════════════════╩═════════════════════════════╝

قوائم مرتبة للعناصر (فريدة أم لا)
تتوافق مع واجهة Java المسماة List
يمكن الوصول إليها عن طريق الفهرس

تنفيذها باستخدام

  • قائمة مرتبطة
  • ArrayList

قوائم العناصر الفريدة:
تتوافق مع واجهة Java المسماة Set
يستطيع لا يمكن الوصول إليها عن طريق الفهرس

تنفيذها باستخدام

  • HashSet (غير مرتبة)
  • LinkedHashSet (مرتب)
  • TreeSet (مرتبة حسب الترتيب الطبيعي أو حسب المقارنة المتوفرة)

كلا الواجهات Set و List تتوافق مع واجهة Java المسماة Collection

وهناك مجموعة لا يمكن أن تحتوي عناصر مكررة في حين أن قائمة العلبة. A قائمة (في جاوة) أيضا يعني النظام.

  • القائمة عبارة عن مجموعة مرتبة من العناصر
  • المجموعة عبارة عن مجموعة غير مرتبة من العناصر مع عدم السماح بالتكرار (عادة)

من الناحية النظرية نشير عادةً إلى مجموعة غير مرتبة تسمح بالتكرارات كحقيبة ولا تسمح بالتكرارات فهي مجموعة.

قائمة

  1. هي مجموعة مرتبة من العناصر.
  2. يتم استخدام القائمة لجمع العناصر ذات التكرارات.
  3. يتم تعريف طرق جديدة داخل واجهة قائمة.

تعيين

  1. هي مجموعة غير مرتبة من العناصر.
  2. يتم استخدام Set لجمع العناصر دون التكرارات.
  3. لم يتم تعريف أي أساليب جديدة داخل واجهة المجموعة، لذلك يتعين علينا استخدام أساليب واجهة المجموعة فقط مع الفئات الفرعية للمجموعة.

قائمة:

يسمح

وLists عموما كائنات مكررة. يجب أن يؤمر Lists، وبالتالي يمكن الوصول إليها من قبل مؤشر.

وتشمل فئات التنفيذ: ArrayList، LinkedList، Vector

تعيين:

وSets القيام على لا السماح كائنات مكررة. معظم تطبيقات هي غير مرتبة، ولكنها محددة للتنفيذ.

وتشمل فئات التنفيذ:  HashSet (غير مرتبة)،  LinkedHashSet (أمر)،  TreeSet (بأمر من النظام الطبيعي أو المقدمة مقارنة)

بما أننا نتحدث عن واجهات Java فلماذا لا ننظر إلى Javadoc؟!

  • أ List هي مجموعة مرتبة (تسلسل) ، والتي تسمح عادة بالتكرارات
  • أ Set A IS مجموعة لا تحتوي على عناصر مكررة ، قد يكون أمر التكرار مضمونًا من خلال التنفيذ

لا يوجد أي ذكر لعدم وجود ترتيب فيما يتعلق بالمجموعات:ذلك يعتمد على التنفيذ.

وهذا قد لا يكون الجواب كنت تبحث عنه، ولكن جافادوك الطبقات مجموعات هو في الواقع وصفي جدا. نسخ / لصق:

<اقتباس فقرة>   

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

     

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

وهناك مجموعة هي مجموعة غير مرتبة من الكائنات متميزة - لا يسمح لأي كائنات مكررة. ويتم تنفيذ عموما باستخدام رمز تجزئة الكائنات التي يتم إدراجها. (تطبيقات محددة قد تضيف يأمر، ولكن واجهة مجموعة في حد ذاته لا).

وقائمة هي مجموعة مرتبة من الأشياء التي قد تحتوي على التكرارات. يمكن تنفيذه مع ArrayList، LinkedList، وما إلى ذلك.

و1.List يسمح القيم المكررة ومجموعة does'nt السماح التكرارات

و2.List يحافظ على الترتيب الذي قمت بإدراجه عناصر في لائحة تعيين does'nt حفاظ على النظام. 3.List هو تسلسل أمر من العناصر في حين يتم تعيين قائمة متميزة من العناصر التي هي غير مرتبة.

قائمة مقابل مجموعة

1) المجموعة لا تسمح بالتكرارات.تسمح القائمة بالتكرار.بناءً على تنفيذ Set، فإنه يحافظ أيضًا على ترتيب الإدراج.

على سبيل المثال : LinkedHashSet.ويحافظ على ترتيب الإدراج. يرجى الرجوع انقر هنا

2) يتضمن طريقة.بحكم طبيعة المجموعة، فإنها ستوفر أداءً أفضل للوصول إليها.أفضل حالة لها (1).لكن القائمة لديها مشكلة في الأداء يجب استدعاءها contains.

قائمة:
تسمح القائمة بالعناصر المكررة والقيم الخالية.من السهل البحث باستخدام الفهرس المقابل للعناصر، كما أنه سيعرض العناصر بترتيب الإدراج.مثال:(قائمة مرتبطة)

import java.util.*;

public class ListExample {

 public static void main(String[] args) {
    // TODO Auto-generated method stub

    List<Integer> l=new LinkedList<Integer>();
    l.add(001);
    l.add(555);
    l.add(333);
    l.add(888);
    l.add(555);
    l.add(null);
    l.add(null);

    Iterator<Integer> il=l.iterator();

    System.out.println(l.get(0));

    while(il.hasNext()){
        System.out.println(il.next());
    }

    for(Integer str : l){
        System.out.println("Value:"+str);
    }
 }

}

انتاج:

1
1
555
333
888
555
باطل
باطل
القيمة:1
القيمة:555
القيمة:333
القيمة:888
القيمة:555
القيمة: فارغة
القيمة: فارغة

تعيين:
لا تسمح المجموعة بأي عناصر مكررة وتسمح بقيمة فارغة واحدة. ولن تحافظ على أي ترتيب لعرض العناصر.فقط TreeSet سيتم عرضها بترتيب تصاعدي.

مثال:(TreeSet)

import java.util.TreeSet;

public class SetExample {

 public static void main(String[] args) {
    // TODO Auto-generated method stub

    TreeSet<String> set = new TreeSet<String>();
    try {
        set.add("hello");
        set.add("world");
        set.add("welcome");
        set.add("all");

        for (String num : set) {
            System.out.println( num);

        }
        set.add(null);
    } catch (NullPointerException e) {
        System.out.println(e);
        System.out.println("Set doesn't allow null value and duplicate value");
    }

 }

}

انتاج:

الجميع
مرحبًا
مرحباً
عالم
java.lang.NullPointerException
لا تسمح المجموعة بالقيمة الخالية والقيمة المكررة

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

والطبقات Set لا الحفاظ على النظام الإدراج. ويمكن أن تفرض اختياريا ترتيب معين (كما هو الحال مع SortedSet)، ولكن عادة ما يكون أمرا المعرفة من قبل التنفيذ استنادا إلى بعض وظيفة التجزئة (كما هو الحال مع HashSet). منذ يتم الوصول إليها بواسطة مفتاح Sets، لا يسمح التكرارات.

والترتيب ... قائمة لها النظام، ومجموعة لا.

يتم تقديم بعض الاختلافات الجديرة بالملاحظة بين List وSet في Java على النحو التالي:

1) الفرق الأساسي بين القائمة والتعيين في Java هو السماح بالعناصر المكررة.تسمح القائمة في Java بالتكرارات بينما لا يسمح Set بأي تكرار.إذا قمت بإدراج نسخة مكررة في المجموعة فسوف تحل محل القيمة الأقدم.أي تطبيق لـ Set in Java سيحتوي فقط على عناصر فريدة.

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

3) يتضمن التنفيذ الشائع لواجهة القائمة في Java ArrayList وVector وLinkedList.في حين أن التنفيذ الشائع لواجهة Set يتضمن HashSet وTreeSet وLinkedHashSet.

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

قائمة:

  1. التكرارات المسموح بها.
  2. مرتبة في تجميع العناصر. (وبعبارة أخرى لها ترتيب محدد. لا حاجة للفرز بترتيب تصاعدي)

تعيين:

  1. غير مسموح بالتكرارات.
  2. غير مرتبة في تجميع العناصر. (بعبارة أخرى ليس لها ترتيب محدد. قد تكون أو لا تكون مرتبة بترتيب تصاعدي)

وSet<E> وList<E> وكلاهما يستخدم لتخزين عناصر نوع E. والفرق هو أن يتم تخزين Set بطريقة غير مرتبة ولا يسمح قيم مكررة. يستخدم List لتخزين العناصر في طريقة أمر وأنه لا يسمح قيم مكررة.

لا يمكن الوصول

وعناصر Set من وضع مؤشر، ويمكن الوصول إلى عناصر List مع وضع المؤشر.

مرحبًا، لقد تم بالفعل تقديم العديد من الإجابات.. واسمحوا لي أن أشير إلى بعض النقاط التي لم يتم ذكرها حتى الآن:

  • معظم تطبيقات القائمة (ArrayList،Vector) ينفذ RandomAccess الواجهة وهي واجهة علامة للوصول بشكل أسرع.لا تفعل أي من تطبيقات Set ذلك.
  • تستخدم القائمة مكررًا خاصًا يسمى ListIterator الذي يدعم التكرار في كلا الاتجاهين.يستخدم Set Iterator الذي يدعم التكرار بطريقة واحدة فقط
  • يأخذ HashSet ذاكرة أكبر بـ 5.5 مرات من ArrayList لتخزين نفس العدد من العناصر.

إليك مثال واضح على رائع.أقوم بإنشاء مجموعة وقائمة.ثم أحاول تخزين 20 قيمة تم إنشاؤها عشوائيًا داخل كل قائمة.يمكن أن تكون القيمة التي تم إنشاؤها في النطاق من 0 إلى 5

s = [] as Set
l = []

max = 5
print "random Numbers :"
20.times{
e = (int)Math.random()*max
s << e
l << e
print "$e, "
}


println "\n"
println "Set : $s "
println "list : $l

النتائج :

أرقام عشوائية: 4, 1, 4, 0, 1, 2, 4, 0, 0, 3, 4, 3, 2, 0, 4, 0, 1, 3, 1, 3

تعيين : [4, 1, 0, 2, 3]

قائمة : [4, 1, 4, 0, 1, 2, 4, 0, 0, 3, 4, 3, 2, 0, 4, 0, 1, 3, 1, 3]

يمكنك أن ترى أن الفرق هو أن:

  • لا تسمح المجموعة بقيم مكررة.
  • تسمح القائمة بالقيم المكررة.

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

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

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

اسم الموضوع:قائمة مقابل مجموعة

لقد قمت للتو بمراجعة أهم موضوع في Java والذي يسمى Collections Framework.فكرت في مشاركة معرفتي البسيطة حول المجموعات معك.تعد القائمة والتعيين والخريطة أهم موضوع فيها.فلنبدأ بالقائمة والضبط.

الفرق بين القائمة والمجموعة:

  1. القائمة هي فئة المجموعة التي تمتد AbstractList فئة حيث Set هي فئة مجموعة تمتد AbstractSet فئة ولكن كلاهما يطبق واجهة المجموعة.

  2. تسمح واجهة القائمة بقيم مكررة (عناصر) بينما لا تسمح واجهة Set بقيم مكررة.في حالة وجود عناصر مكررة في المجموعة، فإنه يحل محل القيم القديمة.

  3. تسمح واجهة القائمة بقيم NULL بينما لا تسمح واجهة Set بقيم Null.في حالة استخدام القيم الخالية في Set فإنه يعطي NullPointerException.

  4. تحافظ واجهة القائمة على ترتيب الإدراج.وهذا يعني الطريقة التي نضيف بها العناصر في القائمة بنفس الطريقة التي نحصل عليها بها باستخدام المكرر أو لكل نمط.بينما Set لا تحافظ التطبيقات بالضرورة على ترتيب الإدراج.(بالرغم من SortedSet يستخدم TreeSet, ، و LinkedHashSet يحافظ على ترتيب الإدراج).

  5. تحتوي واجهة القائمة على طرق خاصة بها محددة بينما لا تحتوي واجهة Set على طريقتها الخاصة، لذا تستخدم Set طرق واجهة المجموعة فقط.

  6. تحتوي واجهة القائمة على فئة قديمة واحدة تسمى Vector بينما لا تحتوي واجهة Set على أي فئة قديمة

  7. أخيرا وليس آخرا...ال listIterator() لا يمكن استخدام الطريقة إلا للتنقل بين العناصر الموجودة داخل فئات القائمة بينما يمكننا استخدام طريقة iterator() للوصول إلى عناصر الفئة المحددة

هل هناك أي شيء آخر يمكننا إضافته؟أخبرونى من فضلكم.

شكرًا.

تعيين:

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

قائمة:

يمكن أن يكون لها قيم مكررة تم طلبها افتراضيًا يمكن أن يكون لها إمكانية الوصول بواسطة الفهرس

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