سؤال

بالنظر إلى مجموعة من n الكائنات, دعنا نقول هو مجموعة من السلاسل, و أنه يحتوي على القيم التالية:

foo[0] = "a";
foo[1] = "cc";
foo[2] = "a";
foo[3] = "dd";

ماذا علي أن أفعل حذف/إزالة جميع سلاسل/الكائنات يساوي "أ" في المصفوفة ؟

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

المحلول

[إذا كنت تريد بعض الجاهزة للاستخدام رمز من فضلك انتقل إلى "Edit3" (بعد قطع).والباقي هو هنا من أجل الأجيال القادمة.]

لتجسيد الزبال فكرة:

List<String> list = new ArrayList<String>(Arrays.asList(array));
list.removeAll(Arrays.asList("a"));
array = list.toArray(array);

تحرير:أنا الآن باستخدام Arrays.asList بدلا من Collections.singleton:المفرد يقتصر على إدخال واحد ، في حين أن asList النهج يسمح لك بإضافة سلاسل أخرى لتصفية في وقت لاحق: Arrays.asList("a", "b", "c").

Edit2:النهج المذكور أعلاه يحتفظ بنفس array (حتى الصفيف لا يزال هو نفسه طول);العنصر بعد آخر هو تعيين إلى null.إذا كنت ترغب في جديد مجموعة الحجم بالضبط كما هو مطلوب, استخدام هذا بدلا من ذلك:

array = list.toArray(new String[0]);

Edit3:إذا كنت تستخدم هذا الرمز على أساس متكرر في نفس الفئة ، قد ترغب في النظر في إضافة هذه الفئة الخاصة بك:

private static final String[] EMPTY_STRING_ARRAY = new String[0];

ثم تصبح وظيفة:

List<String> list = new ArrayList<>();
Collections.addAll(list, array);
list.removeAll(Arrays.asList("a"));
array = list.toArray(EMPTY_STRING_ARRAY);

هذا وسوف ثم وقف رمي النفايات الخاص بك كومة الذاكرة المؤقتة غير مجدية مع سلسلة فارغة المصفوفات التي لولاها أن newإد كل مرة وظيفة الخاص بك يسمى.

cynicalman اقتراح (انظر التعليقات) سوف يساعد أيضا مع كومة القمامة ، الإنصاف ينبغي أن يذكر ذلك:

array = list.toArray(new String[list.size()]);

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

نصائح أخرى

بديل في جافا 8:

String[] filteredArray = Arrays.stream(array)
    .filter(e -> !e.equals(foo)).toArray(String[]::new);

جعل List من مجموعة مع Arrays.asList(), و الاتصال remove() على جميع العناصر المناسبة.ثم اتصل toArray() على 'قائمة' لجعل العودة إلى مجموعة أخرى.

لا رهيب performant ، ولكن إذا كنت تغلف بشكل صحيح, يمكنك دائما أن تفعل شيئا أسرع في وقت لاحق.

يمكنك أن تفعل دائما:

int i, j;
for (i = j = 0; j < foo.length; ++j)
  if (!"a".equals(foo[j])) foo[i++] = foo[j];
foo = Arrays.copyOf(foo, i);

يمكنك استخدام مكتبة خارجي:

org.apache.commons.lang.ArrayUtils.remove(java.lang.Object[] array, int index)

هو في المشروع أباتشي العموم لانج http://commons.apache.org/lang/

انظر التعليمات البرمجية أدناه

ArrayList<String> a = new ArrayList<>(Arrays.asList(strings));
a.remove(i);
strings = new String[a.size()];
a.toArray(strings);

إذا كنت تحتاج إلى إزالة عدة عناصر من مجموعة دون تحويله إلى List ولا خلق مجموعة إضافية ، قد تفعل ذلك في O(n) لا تعتمد على عدد من العناصر إلى إزالة.

هنا ، a هو الأولي مجموعة ، int... r متميزة أمر المؤشرات (المواقف) من عناصر لإزالة:

public int removeItems(Object[] a, int... r) {
    int shift = 0;                             
    for (int i = 0; i < a.length; i++) {       
        if (shift < r.length && i == r[shift])  // i-th item needs to be removed
            shift++;                            // increment `shift`
        else 
            a[i - shift] = a[i];                // move i-th item `shift` positions left
    }
    for (int i = a.length - shift; i < a.length; i++)
        a[i] = null;                            // replace remaining items by nulls

    return a.length - shift;                    // return new "length"
}  

صغيرة الاختبار:

String[] a = {"0", "1", "2", "3", "4"};
removeItems(a, 0, 3, 4);                     // remove 0-th, 3-rd and 4-th items
System.out.println(Arrays.asList(a));        // [1, 2, null, null, null]

في المهمة الخاصة بك, يمكنك المسح الضوئي الأولى مجموعة لجمع مواقف "" ، ثم اتصل removeItems().

شيئا عن تقديم قائمة من ثم إزالة ثم العودة إلى صفيف يبدو لي خطأ.لم تختبر لكن أعتقد التالية سوف أداء أفضل.نعم أنا ربما دون مبرر قبل الأمثل.

boolean [] deleteItem = new boolean[arr.length];
int size=0;
for(int i=0;i<arr.length;i==){
   if(arr[i].equals("a")){
      deleteItem[i]=true;
   }
   else{
      deleteItem[i]=false;
      size++;
   }
}
String[] newArr=new String[size];
int index=0;
for(int i=0;i<arr.length;i++){
   if(!deleteItem[i]){
      newArr[index++]=arr[i];
   }
}

أدرك أن هذا هو آخر العمر ، ولكن بعض الإجابات هنا ساعدني, حتى هنا هو بلدي بنسين' ha'penny يستحق!

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

إذا كان ArrayList أنك تعديل ينتهي مع أكبر أو أقل عناصر من أنها بدأت مع الخط List.toArray() يؤدي استثناء, لذلك أنت بحاجة إلى شيء مثل List.toArray(new String[] {}) أو List.toArray(new String[0]) من أجل إنشاء مجموعة جديدة (الصحيح) حجم.

يبدو واضحا الآن أن أعرف ذلك.ليس واضحا حتى الروبوت/Java مبتدئ من الحصول على السيطرة جديدة وغير مألوفة رمز يبني وليس من الواضح من بعض المشاركات في وقت سابق هنا إذا أردت أن تجعل هذه النقطة واضحة جدا لأي شخص آخر في حيرة من امرهم لساعات كما كنت!

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

السبب:لم تعرف جمع حزمة موجودة أو لا تثق به

الحل:استخدام مجموعة.

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

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

الحل:استخدام ArrayList محددة الحجم الأولي.

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

السبب:لديك مجموعة القادمة ومجموعة الخروج--إذا كنت تريد أن تعمل على مجموعة

الحل:تحويله إلى ArrayList حذف البند وتحويله مرة أخرى

السبب:كنت تعتقد أنك يمكن كتابة التعليمات البرمجية أفضل إذا كنت تفعل ذلك بنفسك

الحل:لا يمكنك استخدام مجموعة أو قائمة مرتبطة.

السبب:هذه هي فئة مهمة و غير مسموح لك أو لم يكن لديك الوصول إلى مجموعة من واجهات برمجة التطبيقات لسبب ما

الافتراض:تحتاج مجموعة جديدة الصحيحة "حجم"

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

السبب:تحتاج إلى تشغيل المعدن

الافتراض:يجب أن لا تخصيص مساحة دون داع أو تستغرق وقتا طويلا جدا

الافتراض:أنت تتبع حجم استخدامها في مجموعة (طول) بشكل منفصل لأن خلاف ذلك سيكون لديك إلى إعادة توزيع مجموعة من أجل حذف/إدراج.

مثال لماذا قد ترغب في القيام بذلك:ومجموعة واحدة من الأوليات (دعنا نقول الباحث القيم) هو أخذ قسما كبيرا من ذاكرة الوصول العشوائي الخاصة بك--مثل 50%!ArrayList أن القوة هذه في قائمة المؤشرات إلى عدد من الأشياء التي سوف تستخدم عدة مرات هذا المبلغ من الذاكرة.

الحل:تكرار عبر مجموعة الخاصة بك و كلما تجد عنصر لإزالة (دعنا نسميها عنصر n), استخدام النظام.arraycopy نسخ ذيل مجموعة على "حذف" عنصر (المصدر والوجهة هي نفس مجموعة) - هو ذكي بما فيه الكفاية للقيام نسخ في الاتجاه الصحيح حتى الذاكرة لا الكتابة نفسها:

 System.arraycopy(ary, n+1, ary, n, length-n) 
 length--;

عليك ربما تريد أن تكون أكثر ذكاء من هذا إذا كنت تقوم بحذف أكثر من عنصر واحد في وقت واحد.يمكنك فقط نقل المنطقة بين "مباراة" المقبل بدلا من ذيل كامل و دائما تجنب تحريك أي قطعة مرتين.

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

تحرير:

نقطة مع بالقيم الخالية في مجموعة تم مسح.آسف على التعليقات.

الأصل:

Ehm...الخط

array = list.toArray(array);

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

إذا كنت ترغب في تجنب هذه مجموعة جديدة كما المعلمة toArray().إذا كنت لا تريد استخدام removeAll مجموعة سيكون بديل:

        String[] array = new String[] { "a", "bc" ,"dc" ,"a", "ef" };

        System.out.println(Arrays.toString(array));

        Set<String> asSet = new HashSet<String>(Arrays.asList(array));
        asSet.remove("a");
        array = asSet.toArray(new String[] {});

        System.out.println(Arrays.toString(array));

يعطي:

[a, bc, dc, a, ef]
[dc, ef, bc]

حيث الحالية الإجابة المقبولة من كريس الأسبق الشباب النواتج:

[a, bc, dc, a, ef]
[bc, dc, ef, null, ef]

مع رمز

    String[] array = new String[] { "a", "bc" ,"dc" ,"a", "ef" };

    System.out.println(Arrays.toString(array));

    List<String> list = new ArrayList<String>(Arrays.asList(array));
    list.removeAll(Arrays.asList("a"));
    array = list.toArray(array);        

    System.out.println(Arrays.toString(array));

دون أي قيم فارغة تركت وراءها.

مساهمتي الصغيرة هذه المشكلة.

public class DeleteElementFromArray {
public static String foo[] = {"a","cc","a","dd"};
public static String search = "a";


public static void main(String[] args) {
    long stop = 0;
    long time = 0;
    long start = 0;
    System.out.println("Searched value in Array is: "+search);
    System.out.println("foo length before is: "+foo.length);
    for(int i=0;i<foo.length;i++){ System.out.println("foo["+i+"] = "+foo[i]);}
    System.out.println("==============================================================");
    start = System.nanoTime();
    foo = removeElementfromArray(search, foo);
    stop = System.nanoTime();
    time = stop - start;
    System.out.println("Equal search took in nano seconds = "+time);
    System.out.println("==========================================================");
    for(int i=0;i<foo.length;i++){ System.out.println("foo["+i+"] = "+foo[i]);}
}
public static String[] removeElementfromArray( String toSearchfor, String arr[] ){
     int i = 0;
     int t = 0;
     String tmp1[] = new String[arr.length];     
         for(;i<arr.length;i++){
              if(arr[i] == toSearchfor){     
              i++;
              }
             tmp1[t] = arr[i];
             t++;
     }   
     String tmp2[] = new String[arr.length-t];   
     System.arraycopy(tmp1, 0, tmp2, 0, tmp2.length);
     arr = tmp2; tmp1 = null; tmp2 = null;
    return arr;
}

}

الأولي مجموعة

   int[] array = {5,6,51,4,3,2};

إذا كنت تريد إزالة 51 هذا هو المؤشر 2 ، واستخدام التالية

 for(int i = 2; i < array.length -1; i++){
    array[i] = array[i + 1];
  }

ذلك يعتمد على ما تعنيه ب "ازالة" ؟ مجموعة حجم ثابت بناء - لا يمكنك تغيير عدد من العناصر في ذلك.بحيث يمكنك إما أ) إنشاء جديد, أقصر, مجموعة دون العناصر التي لا تريد أو ب) تعيين إدخالات كنت لا تريد شيئا يدل على 'فارغة' الوضع ؛ عادة ما تكون فارغة إذا كنت لا تعمل مع الأوليات.

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

يهتم بـ "كلوي" لا يمكنني الحصول على رمز تظهر بشكل صحيح.آسف, لقد حصلت على عمل.آسف مرة أخرى, أنا لا أعتقد أنني قراءة السؤال بشكل صحيح.

String  foo[] = {"a","cc","a","dd"},
remove = "a";
boolean gaps[] = new boolean[foo.length];
int newlength = 0;

for (int c = 0; c<foo.length; c++)
{
    if (foo[c].equals(remove))
    {
        gaps[c] = true;
        newlength++;
    }
    else 
        gaps[c] = false;

    System.out.println(foo[c]);
}

String newString[] = new String[newlength];

System.out.println("");

for (int c1=0, c2=0; c1<foo.length; c1++)
{
    if (!gaps[c1])
    {
        newString[c2] = foo[c1];
        System.out.println(newString[c2]);
        c2++;
    }
}

سيتم نسخ جميع العناصر ما عدا واحدة مع مؤشر i:

if(i == 0){
                System.arraycopy(edges, 1, copyEdge, 0, edges.length -1 );
            }else{
                System.arraycopy(edges, 0, copyEdge, 0, i );
                System.arraycopy(edges, i+1, copyEdge, i, edges.length - (i+1) );
            }

في مجموعة من السلاسل مثل

String name = 'a b c d e f b d e' // يمكن أن يكون مثل String name = 'aa bb c d e aa bb f d e'

بناء الطبقة التالية

class clearname{
def parts
def tv
public def str = ''
String name
clearname(String name){
    this.name = name
    this.parts = this.name.split(" ")
    this.tv = this.parts.size()
}
public String cleared(){

        int i
        int k
        int j=0        
    for(i=0;i<tv;i++){
        for(k=0;k<tv;k++){
            if(this.parts[k] == this.parts[i] && k!=i){
               this.parts[k] = '';
                j++
            }
        }
    }
    def str = ''
    for(i=0;i<tv;i++){
        if(this.parts[i]!='')

           this.str += this.parts[i].trim()+' '
    } 
    return this.str    
}}



return new clearname(name).cleared()

الحصول على هذه النتيجة

a b c d e f

نأمل أن يكون هذا رمز تساعد أي شخص تحياتي

class sd 
{
 public static void main(String[ ] args)
 {
     System.out.println("Search and Delete");

    int key;
    System.out.println("Enter the length of array:");
    Scanner in=new Scanner(System.in);
    int n=in.nextInt();
    int numbers[]=new int[n];

      int i = 0;
      boolean found = false;  
      System.out.println("Enter the elements in Array :");
      for ( i = 0; i < numbers.length; i++)
      {
          numbers[i]=in.nextInt();
      }
      System.out.println("The elements in Array are:");
      for ( i = 0; i < numbers.length; i++)
      {
          System.out.println(numbers[i]);
      }
      System.out.println("Enter the element to be searched:");
      key=in.nextInt();
      for ( i = 0; i < numbers.length; i++)
      {
             if (numbers[ i ]  == key)
            {
                     found = true;      
                     break;
             }
       }
      if (found)   
      {
            System.out.println("Found " + key + " at index " + i + ".");
            numbers[i]=0;//haven't deleted the element in array
            System.out.println("After Deletion:");
        for ( i = 0; i < numbers.length; i++)
          {
              if (numbers[ i ]!=0)
            {   //it skips displaying element in array
                        System.out.println(numbers[i]);
            }
          }
      }
      else
      {
            System.out.println(key + "is not in this array.");
      }
  }
}//Sorry.. if there are mistakes.

استخدام:

list.removeAll(...);
//post what char you need in the ... section

تعيين null إلى مجموعة مواقع.

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