English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

تعليمات Java الأساسية

تحكم في العملية Java

مجموعات Java

Java Object-Oriented (I)

Java Object-Oriented (II)

Java Object-Oriented (III)

معالجة الاستثناء Java

قائمة Java (List)

Java Queue (الطابور)

مجموعة Java Map

Java Set集合

Java 输入输出(I/O)

Java Reader/Writer

Java 其他主题

Java EnumSet

在本教程中,我们将借助示例学习Java EnumSet类及其各种方法。

Java集合框架的EnumSet类提供了单个枚举的元素的集合实现。

在学习EnumSet之前,请确保了解Java Enums

它实现Set接口

创建EnumSet

为了创建一个枚举集,我们必须首先导入java.util.EnumSet包。

与其他集合实现不同,枚举集合没有公共构造函数。我们必须使用预定义的方法来创建一个枚举集。

1.使用allOf(Size)

allof()方法创建一个枚举集,其中包含指定枚举类型Size的所有值。 例如,

import java.util.EnumSet;
class Main {
    //一个名为Size的枚举
    enum Size {
        SMALL, MEDIUM, LARGE, EXTRALARGE
    }
    
    public static void main(String[] args) {
        //استخدام allOf() لإنشاء EnumSet
        EnumSet<Size> sizes = EnumSet.allOf(Size.class);
        System.out.println("EnumSet: " + sizes);
    }
}

نتائج الإخراج

EnumSet: [SMALL, MEDIUM, LARGE, EXTRALARGE]

注意声明,

EnumSet<Size> sizes = EnumSet.allOf(Size.class);

在这里,Size.class表示我们创建的Size枚举。

2.使用noneOf(Size)

noneOf()方法创建一个空的枚举集。例如,

import java.util.EnumSet;
class Main {
     //一个名为Size的枚举
    enum Size {
        SMALL, MEDIUM, LARGE, EXTRALARGE
    }
    public static void main(String[] args) {
        // 使用noneOf()创建一个EnumSet
        EnumSet sizes = EnumSet.noneOf(Size.class);
        System.out.println("空EnumSet: " + sizes);
    }
}

نتائج الإخراج

空EnumSet : []

在这里,我们创建了一个名为sizes的空枚举。

注意:我们只能在上述程序中插入枚举类型为Size的元素。 这是因为我们使用Size枚举创建了空的枚举集。

3.使用range(e1,e2)方法

range()方法创建一个枚举集,其中包含e1和e2之间枚举的所有值,包括这两个值。例如

import java.util.EnumSet;
class Main {
    enum Size {
        SMALL, MEDIUM, LARGE, EXTRALARGE
    }
    public static void main(String[] args) {
        //使用range()创建一个EnumSet
        EnumSet sizes = EnumSet.range(Size.MEDIUM, Size.EXTRALARGE);
        System.out.println("EnumSet: " + sizes);
    }
}

نتائج الإخراج

EnumSet: [MEDIUM, LARGE, EXTRALARGE]

4.使用of()方法

of()方法创建一个包含指定元素的枚举集。例如,

import java.util.EnumSet;
class Main {
    enum Size {
        SMALL, MEDIUM, LARGE, EXTRALARGE
    }
    public static void main(String[] args) {
        //使用带有单个参数的of()
        EnumSet sizes1 = EnumSet.of(Size.MEDIUM);
        System.out.println("EnumSet1: " + sizes1);
        EnumSet<Size> sizes2 = EnumSet.of(Size.SMALL, Size.LARGE);
        System.out.println("EnumSet2: " + sizes2);
    }
}

نتائج الإخراج

EnumSet1: [MEDIUM]
EnumSet2: [SMALL, LARGE]

طرق مجموعة الترقيم

يقدم كلاس EnumSet بعض الطرق التي تسمح لنا بإجراء عمليات مختلفة على مجموعة الترقيم.

إدراج العناصر في مجموعة الترقيم

  • add() - إدراج قيمة الترقيم المحددة في مجموعة الترقيم

  • addAll() - إدراج جميع العناصر من مجموعة معينة في المجموعة

على سبيل المثال،

import java.util.EnumSet;
class Main {
    enum Size {
        SMALL, MEDIUM, LARGE, EXTRALARGE
    }
    public static void main(String[] args) {
        //استخدام allOf() لإنشاء EnumSet
        EnumSet<Size> sizes1 = EnumSet.allOf(Size.class);
        //استخدام noneOf() لإنشاء EnumSet
        EnumSet<Size> sizes2 = EnumSet.noneOf(Size.class);
        //استخدام طريقة add لإنشاء عنصر
        sizes2.add(Size.MEDIUM);
        System.out.println("استخدام طريقة add() من EnumSet: " + sizes2);
        //استخدام طريقة addAll()
        sizes2.addAll(sizes1);
        System.out.println("استخدام طريقة addAll() من EnumSet: " + sizes2);
    }
}

نتائج الإخراج

استخدام طريقة add() من EnumSet: [MEDIUM]
استخدام طريقة addAll() من EnumSet: [SMALL, MEDIUM, LARGE, EXTRALARGE]

في المثال السابق، استخدمنا طريقة addAll() لإنشاء جميع العناصر من مجموعة sizes1 وإدراجها في مجموعة sizes2.

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

الوصول إلى عناصر مجموعة الترقيم

للوصول إلى عناصر مجموعة الترقيم يمكننا استخدام طريقة iterator(). من أجل استخدام هذه الطريقة، يجب علينا استيراد مكتبة java.util.Iterator. على سبيل المثال،

import java.util.EnumSet;
import java.util.Iterator;
class Main {
    enum Size {
        SMALL, MEDIUM, LARGE, EXTRALARGE
    }
    public static void main(String[] args) {
        //استخدام allOf() لإنشاء EnumSet
        EnumSet<Size> sizes = EnumSet.allOf(Size.class);
        Iterator<Size> iterate = sizes.iterator();
        System.out.print("EnumSet: ");
        while(iterate.hasNext()) {
            System.out.print(iterate.next());
            System.out.print(", ");
        }
    }
}

نتائج الإخراج

EnumSet: SMALL, MEDIUM, LARGE, EXTRALARGE,

ملاحظات:

  • hasNext() - إذا كان هناك عنصر تالي في مجموعة التغييرات، فأرجع true

  • next() - العنصر التالي في مجموعة التغييرات

إزالة عناصر EnumSet

  • remove() - إزالة العنصر المحدد من مجموعة التغييرات

  • removeAll() - إزالة جميع العناصر من مجموعة التغييرات

على سبيل المثال،

import java.util.EnumSet;
class Main {
    enum Size {
        SMALL, MEDIUM, LARGE, EXTRALARGE
    }
    public static void main(String[] args) {
        // استخدام allOf() لإنشاء EnumSet
        EnumSet<Size> sizes = EnumSet.allOf(Size.class);
        System.out.println("EnumSet: " + sizes);
        // استخدام remove()
        boolean value1 = sizes.remove(Size.MEDIUM);
        System.out.println("هل تم إزالة MEDIUM؟ " + value1);
        // استخدام removeAll()
        boolean value2 = sizes.removeAll(sizes);
        System.out.println("هل تم إزالة جميع العناصر؟ " + value2);
    }
}

نتائج الإخراج

EnumSet: [SMALL, MEDIUM, LARGE, EXTRALARGE]
هل تم إزالة MEDIUM؟ true
هل تم إزالة جميع العناصر؟ true

الطرق الأخرى

الطريقةالوصف
copyOf()إنشاء نسخة من EnumSet
contains()ابحث في Element المحدد من قبل EnumSet، وأرجع النتيجة الحالة
isEmpty()تحقق من ما إذا كان EnumSet فارغًا
size()إرجاع حجم EnumSet
clear()إزالة جميع العناصر من EnumSet

واجهات قابلة للنسخ وقابلة للتسلسل

تقوم فئة EnumSet أيضًا بتنفيذ واجهات Cloneable وSerializable.

واجهة Cloneable

يُمكن للفئة EnumSet إنتاج نسخة من مثيل الفئة.

واجهة قابلة للتسلسل (Serializable)

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

واجهة Serializable تسمح للفئة بأن يتم تسلسلها. هذا يعني أنSerializable يمكن تحويل كائنات الفئة المطبقة إلى أبنية أو بتات.

لماذا اختيار EnumSet؟

تقدم مجموعة المفردات طريقة أكثر فعالية لتخزين قيم المفردات مقارنة بالطرق الأخرى مثل HashSet و TreeSet.

تخزن مجموعة المفردات فقط القيم الخاصة بالمفردات المحددة. لذلك، يعرف JVM جميع القيم المحتملة للمجموعة.

لذلك يتم تنفيذ مجموعة المفردات داخليًا كسلسلة من الأبنية. تحدد الأبنية ما إذا كان العنصر موجودًا في مجموعة المفردات.

إذا كان العنصر موجودًا في المجموعة، فافتح الموضع المخصص له.