سؤال

هذا السؤال سبق الجواب هنا:

هل هناك أي سريعة (و يبحث لطيفة) طريقة لإزالة عنصر من مجموعة في جافا ؟

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

المحلول

يمكنك استخدام ArrayUtils الخاص بـ commons lang.

array = ArrayUtils.removeElement(array, element)

مكتبة commons.Apache.org:Javadocs

نصائح أخرى

سؤالك ليس واضحا جدا.من إجابتك الخاصة، أستطيع أن أقول بشكل أفضل ما تحاول القيام به:

public static String[] removeElements(String[] input, String deleteMe) {
    List result = new LinkedList();

    for(String item : input)
        if(!deleteMe.equals(item))
            result.add(item);

    return result.toArray(input);
}

ملحوظة:هذا لم يتم اختباره.يتم ترك التحقق من الأخطاء كتمرين للقارئ (سأرمي IllegalArgumentException إذا كان الإدخال أو الحذف فارغًا؛القائمة الفارغة في إدخال القائمة الخالية لا معنى لها.قد يكون من المنطقي إزالة السلاسل الفارغة من المصفوفة، لكنني سأترك ذلك كتمرين أيضًا؛حاليًا، سوف يرمي NPE عندما يحاول استدعاء يساوي علىdeleteMe إذا كان موقعdeleteMe فارغًا.)

الاختيارات التي قمت بها هنا:

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

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

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

public void removeElement(Object[] arr, int removedIdx) {
    System.arraycopy(arr, removedIdx + 1, arr, removedIdx, arr.length - 1 - removedIdx);
}

تحرير ردًا على التعليق (tl;dr):

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

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

لنفترض أن لديك مصفوفة تستهلك، على سبيل المثال، 100 ميجابايت من ذاكرة الوصول العشوائي.الآن تريد التكرار عليه وحذف 20 عنصرًا.

جربها...

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

لا يمكنك إزالة عنصر من مصفوفة Java الأساسية.ألقِ نظرة على المجموعات المختلفة وArrayList بدلاً من ذلك.

سيكون الحل الجميل هو استخدام القائمة بدلاً من المصفوفة في المقام الأول.

List.remove(index)

اذا أنت يملك لاستخدام المصفوفات، مكالمتين ل System.arraycopy سيكون على الأرجح الأسرع.

Foo[] result = new Foo[source.length - 1];
System.arraycopy(source, 0, result, 0, index);
if (source.length != index) {
    System.arraycopy(source, index + 1, result, index, source.length - index - 1);
}

(Arrays.asList يعد أيضًا مرشحًا جيدًا للعمل مع المصفوفات، لكن لا يبدو أنه يدعم ذلك remove.)

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

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

بالمناسبة، TopCoder، أي شخص؟دائما تلك المعلمات مجموعة!لذا كن مستعدًا لتكون قادرًا على التعامل معهم عندما تكون في الساحة.

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

امل ان يساعد!

public char[] remove(char[] symbols, char c)
{
    for (int i = 0; i < symbols.length; i++)
    {
        if (symbols[i] == c)
        {
            char[] copy = new char[symbols.length-1];
            System.arraycopy(symbols, 0, copy, 0, i);
            System.arraycopy(symbols, i+1, copy, i, symbols.length-i-1);
            return copy;
        }
    }
    return symbols;
}

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

هناك حاجة إلى المزيد من الشروط المسبقة لتلك التي كتبها بيل ك ودادين

Object[] newArray = new Object[src.length - 1];
if (i > 0){
    System.arraycopy(src, 0, newArray, 0, i);
}

if (newArray.length > i){
    System.arraycopy(src, i + 1, newArray, i, newArray.length - i);
}

return newArray;

لا يمكنك تغيير طول المصفوفة، ولكن يمكنك تغيير القيم التي يحتفظ بها الفهرس عن طريق نسخ قيم جديدة وتخزينها في رقم فهرس موجود.1=مايك , 2=جيف // 10 = جورج 11 يذهب إلى 1 للكتابة فوق مايك .

Object[] array = new Object[10];
int count = -1;

public void myFunction(String string) {
    count++;
    if(count == array.length) { 
        count = 0;  // overwrite first
    }
    array[count] = string;    
}

حسنا, وتشك كثيرا الآن يمكنني استخدام sth مثل هذا:

public static String[] removeElements(String[] input, String deleteMe) {
    if (input != null) {
        List<String> list = new ArrayList<String>(Arrays.asList(input));
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i).equals(deleteMe)) {
                list.remove(i);
            }
        }
        return list.toArray(new String[0]);
    } else {
        return new String[0];
    }
}

ينسخ المصفوفة الأصلية الخاصة بك إلى مصفوفة أخرى، دون إزالة العنصر.

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

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

أتمنى أن تستخدم مجموعة Java / مجموعات Java Commons!

باستخدام java.util.ArrayList، يمكنك القيام بأشياء مثل ما يلي:

yourArrayList.remove(someObject);

yourArrayList.add(someObject);

استخدم ArrayList:

alist.remove(1); //removes the element at position 1

بالتأكيد، إنشاء مجموعة أخرى :)

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