"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية إزالة العناصر من شريحة بشكل متكرر في Go؟

كيفية إزالة العناصر من شريحة بشكل متكرر في Go؟

تم النشر بتاريخ 2024-11-07
تصفح:377

How to Remove Elements from a Slice Iteratively in Go?

إزالة العناصر من شريحة بشكل متكرر

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

a := []string{"abc", "bbc", "aaa", "aoi", "ccc"}
for i := range a { // BAD
    if conditionMeets(a[i]) {
        a = append(a[:i], a[i 1:]...)
    }
}

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

حلقة هابطة

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

a := []string{"abc", "bbc", "aaa", "aoi", "ccc"}
for i := len(a) - 1; i >= 0; i-- {
    if conditionMeets(a[i]) {
        a = append(a[:i], a[i 1:]...)
    }
}

طريقة بديلة للعديد من عمليات الإزالة

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

a := []string{"abc", "bbc", "aaa", "aoi", "ccc"}
b := make([]string, len(a))
copied := 0
for _, s := range(a) {
    if !conditionMeets(s) {
        b[copied] = s
        copied  
    }
}
b = b[:copied]

الإزالة الموضعية للعديد من عمليات الإزالة (الغرض العام)

تتضمن تقنية الإزالة الموضعية الاحتفاظ بمؤشرين وتعيين غير- العناصر القابلة للإزالة في نفس الشريحة مع تصفية مواقع العناصر المحذوفة:

a := []string{"abc"، "bbc"، "aaa"، "aoi"، "ccc"}
منسوخ :=0
لأني := 0; أنا 
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3