powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как быстро удалить строку из String[ ]?
18 сообщений из 18, страница 1 из 1
Как быстро удалить строку из String[ ]?
    #32888417
xa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
public iterface Deleter{

public String[ ] (String[ ], String forDelete );

}
...
Рейтинг: 0 / 0
Как быстро удалить строку из String[ ]?
    #32888971
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XA public iterface Deleter{

public String[ ] (String[ ], String forDelete );

}
А чем не устраивает решение "в лоб"? Типа

public String[] (String[] sa, String forDelete){
Vector v = new Vector();
for (int i=0;i<sa.length;i++)
if (!sa .equals(forDelete))
v.addElement(sa);
String[] res = new String[v.size()];
for (int i=0;i<res.length;i++)
res = (String)v.elementAt(i);
return res;
}
...
Рейтинг: 0 / 0
Как быстро удалить строку из String[ ]?
    #32889227
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗашедшийА чем не устраивает решение "в лоб"?

Тем что оно медленное.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
     public   static  String[] remove(String[] array, String toDelete) {
         if  (array ==  null  || array.length ==  0 ) {
             return  array;
        }

         int  index = - 1 ;
         for  ( int  i =  0 ; i < array.length; i++) {
            String s = array[i];
             if  (s.equals(toDelete)) {
                index = i;
                 break ;
            }
        }

        String[] result;
         if  (index == - 1 ) {
            result =  new  String[array.length];
            System.arraycopy(array,  0 , result,  0 , array.length);
        }  else  {
            result =  new  String[array.length -  1 ];
            System.arraycopy(array,  0 , result,  0 , index);
            System.arraycopy(array, index +  1 , result, index, array.length - (index+ 1 ));
        }
         return  result;
    }

Тест:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
...
        String[] test = {"a", "b", "c", "d", "e", "f", "g","h","i","j"};
         long  time = System.currentTimeMillis();
         for  ( int  i =  0 ; i <  50000 ; i++) {
            remove(test, "xxx");
             for  ( int  j =  0 ; j < test.length; j++) {
                remove(test, test[j]);
            }
        }
        System.out.println("time spend: " + (System.currentTimeMillis() - time));
...
        мой:  281  ms
        твой:  721  ms
...
Рейтинг: 0 / 0
Как быстро удалить строку из String[ ]?
    #32889248
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patch:
if (s.equals(toDelete)) ->
if (s!=null && s.equals(toDelete))
...
Рейтинг: 0 / 0
Как быстро удалить строку из String[ ]?
    #32889261
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя у нас разные решения.
Я удаляю первую строку, а ты все.
...
Рейтинг: 0 / 0
Как быстро удалить строку из String[ ]?
    #32889266
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PS а если надо удалить все элементы, равные заданному?

PPS то есть: удаление "as" из {"qw", "as", "zx", "df", "as", "23", "vb"} -> {"qw", "zx", "df", "23", "vb"}

--
Lacrima Mosa Est
...
Рейтинг: 0 / 0
Как быстро удалить строку из String[ ]?
    #32889348
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А.Грасоff™PS а если надо удалить все элементы, равные заданному?

PPS то есть: удаление "as" из {"qw", "as", "zx", "df", "as", "23", "vb"} -> {"qw", "zx", "df", "23", "vb"}

--
Lacrima Mosa Est

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
     public   static  String[] remove1(String[] array, String toDelete) {
        Vector v =  new  Vector();
         for  ( int  i =  0 ; i < array.length; i++) {
             if  (!array[i].equals(toDelete)) {
                v.addElement(array[i]);
            }
        }
        String[] res =  new  String[v.size()];
         for  ( int  i =  0 ; i < res.length; i++) {
            res[i] = (String) v.elementAt(i);
        }
         return  res;
    }

   public   static  String[] remove2(String[] array, String toDelete) {
         if  (array ==  null  || array.length ==  0 ) {
             return  array;
        }

        String[] buffer =  new  String[array.length];

         int  index = - 1 , prevIndex = - 1 ;
         int  count =  0 ;
         for  ( int  i =  0 ; i < array.length; i++) {
            String s = array[i];
             if  (s!= null  && s.equals(toDelete)) {
                prevIndex = index;
                index = i;
                System.arraycopy(array, prevIndex +  1 , buffer, prevIndex +  1  - count++, index - (prevIndex +  1 ));
            }
        }
        System.arraycopy(array, index +  1 , buffer, index +  1  - count, array.length - (index +  1 ));

         if  (count ==  0 ) {
             return  buffer;
        }

        String[] result =  new  String[array.length - count];
        System.arraycopy(buffer,  0 , result,  0 , array.length - count);
         return  result;
    }


     public   static   void  main(String[] args) {

        String[] test = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j"};
         long  time = System.currentTimeMillis();
         for  ( int  i =  0 ; i <  50000 ; i++) {
            remove1(test, "xxx");
             for  ( int  j =  0 ; j < test.length; j++) {
                remove1(test, test[j]);
            }
        }
        System.out.println("time spend 1: " + (System.currentTimeMillis() - time));

        time = System.currentTimeMillis();
         for  ( int  i =  0 ; i <  50000 ; i++) {
            remove2(test, "xxx");
             for  ( int  j =  0 ; j < test.length; j++) {
                remove2(test, test[j]);
            }
        }
        System.out.println("time spend 2: " + (System.currentTimeMillis() - time));
    }
...
     time spend:  2794 
     time spend:  1362  

2 раза.
...
Рейтинг: 0 / 0
Как быстро удалить строку из String[ ]?
    #32889403
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я же пошутил :)
...
Рейтинг: 0 / 0
Как быстро удалить строку из String[ ]?
    #32889447
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я тоже %)
...
Рейтинг: 0 / 0
Как быстро удалить строку из String[ ]?
    #32889717
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, я сначала что-то вроде функции из Вашего второго сообщения и написал. Потом подумал, что подобных значений может быть несколько во входном массиве и ввел Vector. Что копирование через System.arrayCopy быстрее, чем через Vector - понятно, однако менее наглядно и с точки зрения дальнейшей поддержки другими программистами часто вызывает проблемы. Хотя если это спецкласс, в который вынесены подобные функции для общего использования остальными разработчиками, и меняется в основном только автором, то вариант с промежуточным массивом правильнее, конечно. У нас просто такая специфика, что основные тормоза происходят из-за запросов к большим БД, поэтому остальное требуют писать более удобным в модификации и поддержке, пусть даже в ущерб производительности.
P.S. И часто эта привычка мешает :(
...
Рейтинг: 0 / 0
Как быстро удалить строку из String[ ]?
    #32889830
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зашедший
Придерживаюсь аналогичной позиции. Не стоит оптимизировать то, что не влияет на производительность.

Однако разминка для извилин никогда не повредит Ж)
...
Рейтинг: 0 / 0
Как быстро удалить строку из String[ ]?
    #32889867
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUs Зашедший
Придерживаюсь аналогичной позиции. Не стоит оптимизировать то, что не влияет на производительность.

Однако разминка для извилин никогда не повредит Ж)
Согласен. Спасибо за напоминание :)
...
Рейтинг: 0 / 0
Как быстро удалить строку из String[ ]?
    #32954278
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, переписывал некоторые свои старые классы, заодно изменил в данном примерчике Vector на ArrayList (в нем методы не синхронизированы) - работа в полтора раза ускорилась :)
...
Рейтинг: 0 / 0
Как быстро удалить строку из String[ ]?
    #32954723
mozheyko_d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё чуть короче и быстрее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
...
    public   static  String[] remove3(String[] array, String toDelete) {
	 for ( int  i =  0 ; i < array.length; i++)	
		 if ( toDelete.equals( array[i])) {
			String[] tmp =  new  String[array.length -  1 ];
			System.arraycopy(array,  0 , tmp,  0 ,  i);
			System.arraycopy(array, i +  1 , tmp, i,  array.length - i -  1 );
			array = tmp;
		}
	 return  array;
   }
...
time spend  1 :  9713 
time spend  2 :  3889 
time spend  3 :  3376 
...
Рейтинг: 0 / 0
Как быстро удалить строку из String[ ]?
    #32955418
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mozheyko_dЕщё чуть короче и быстрее:

В этом решении есть ошибка. Должен быть декремент i, после удалёния элемента.

Но здравное зерно тоже есть.
Представляю модифицированный N2 :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
     public   static  String[] remove4(String[] array, String toDelete) {
         int  index =  0 ;
         int  count =  0 ;
         for  ( int  i =  0 , prevIndex; i < array.length; i++) {
             if  (toDelete.equals(array[i])) {
                prevIndex = index;
                index = i +  1 ;
                 if  (count ==  0 ) {
                    System.arraycopy(array,  0 , array =  new  String[array.length],  0 , array.length);
                }  else  {
                    System.arraycopy(array, prevIndex, array, prevIndex - count, i - prevIndex);
                }
                count++;
            }
        }
         if  (count ==  0 )  return  array;

        System.arraycopy(array, index, array, index - count, array.length - index);

        String[] result =  new  String[array.length - count];
        System.arraycopy(array,  0 , result,  0 , array.length - count);

         return  result;
    }
Тест слегка исправлен, что бы можно было обнаружить ошибку алгоритме 3:
Код: plaintext
1.
String[] test = {"a", "b", "b", "c", "d", "e", "f", "g", "h", "i", "j", "a", "b", "b", "c", "d", "e", "f", "g", "h", "i", "j"};
Результат на новом тесте:

time spend 1: 2500
time spend 2: 1594
time spend 3: 1531
time spend 2(modified): 1484


Призапуске теста с ключём -server:

time spend 1: 1890
time spend 2: 1188
time spend 3: 1250 (!)
time spend 2(modified): 1094

:))
...
Рейтинг: 0 / 0
Как быстро удалить строку из String[ ]?
    #32955423
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
естественно, я тестировал исправленный вариант N3:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
   public   static  String[] remove3(String[] array, String toDelete) {
         for  ( int  i =  0 ; i < array.length; i++) {
             if  (toDelete.equals(array[i])) {
                String[] tmp =  new  String[array.length -  1 ];
                System.arraycopy(array,  0 , tmp,  0 , i);
                System.arraycopy(array, i +  1 , tmp, i, array.length - i -  1 );
                array = tmp;
                i--;
            }
        }
         return  array;
    }
...
Рейтинг: 0 / 0
Как быстро удалить строку из String[ ]?
    #32955424
кодо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NotGonnaGetUs mozheyko_dЕщё чуть короче и быстрее:

В этом решении есть ошибка. Должен быть декремент i, после удалёния элемента.

Но здравное зерно тоже есть.
Представляю модифицированный N2 :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
     public   static  String[] remove4(String[] array, String toDelete) {
         int  index =  0 ;
         int  count =  0 ;
         for  ( int  i =  0 , prevIndex; i < array.length; i++) {
             if  (toDelete.equals(array[i])) {
                prevIndex = index;
                index = i +  1 ;
                 if  (count ==  0 ) {
                    System.arraycopy(array,  0 , array =  new  String[array.length],  0 , array.length);
                }  else  {
                    System.arraycopy(array, prevIndex, array, prevIndex - count, i - prevIndex);
                }
                count++;
            }
        }
         if  (count ==  0 )  return  array;

        System.arraycopy(array, index, array, index - count, array.length - index);

        String[] result =  new  String[array.length - count];
        System.arraycopy(array,  0 , result,  0 , array.length - count);

         return  result;
    }
Тест слегка исправлен, что бы можно было обнаружить ошибку алгоритме 3:
Код: plaintext
1.
String[] test = {"a", "b", "b", "c", "d", "e", "f", "g", "h", "i", "j", "a", "b", "b", "c", "d", "e", "f", "g", "h", "i", "j"};
Результат на новом тесте:

time spend 1: 2500
time spend 2: 1594
time spend 3: 1531
time spend 2(modified): 1484


Призапуске теста с ключём -server:

time spend 1: 1890
time spend 2: 1188
time spend 3: 1250 (!)
time spend 2(modified): 1094

:))

тебе заняться нечем? напиши фак про java.lang.annotation.* и вообще про @
...
Рейтинг: 0 / 0
Как быстро удалить строку из String[ ]?
    #32955453
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ой, не заметил.
prevIndex можно совсем удалить из кода.
но на производительность это сущ. не влияет :)

Ещё пару раз по запускал с ключём -server, в среднем выходит такой результат:

time spend 1: 1891
time spend 2: 1172
time spend 3: 1187
time spend 2(modified): 1078


2кодо:
так faq про аннотации есть почти везде.
например, на javable.com: http://www.javable.com/docs/articles/annot/

а поганять массивы это забавно :)
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Как быстро удалить строку из String[ ]?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]