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

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

}
...
Рейтинг: 0 / 0
28.01.2005, 12:35
    #32888971
Зашедший
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро удалить строку из String[ ]?
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
28.01.2005, 13:48
    #32889227
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро удалить строку из String[ ]?
ЗашедшийА чем не устраивает решение "в лоб"?

Тем что оно медленное.
Код: 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
28.01.2005, 13:52
    #32889248
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро удалить строку из String[ ]?
patch:
if (s.equals(toDelete)) ->
if (s!=null && s.equals(toDelete))
...
Рейтинг: 0 / 0
28.01.2005, 13:55
    #32889261
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро удалить строку из String[ ]?
Хотя у нас разные решения.
Я удаляю первую строку, а ты все.
...
Рейтинг: 0 / 0
28.01.2005, 13:57
    #32889266
А.Грасоff™
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро удалить строку из String[ ]?
PS а если надо удалить все элементы, равные заданному?

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

--
Lacrima Mosa Est
...
Рейтинг: 0 / 0
28.01.2005, 14:17
    #32889348
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро удалить строку из String[ ]?
А.Грасо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
28.01.2005, 14:32
    #32889403
А.Грасоff™
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро удалить строку из String[ ]?
я же пошутил :)
...
Рейтинг: 0 / 0
28.01.2005, 14:44
    #32889447
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро удалить строку из String[ ]?
я тоже %)
...
Рейтинг: 0 / 0
28.01.2005, 15:49
    #32889717
Зашедший
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро удалить строку из String[ ]?
Кстати, я сначала что-то вроде функции из Вашего второго сообщения и написал. Потом подумал, что подобных значений может быть несколько во входном массиве и ввел Vector. Что копирование через System.arrayCopy быстрее, чем через Vector - понятно, однако менее наглядно и с точки зрения дальнейшей поддержки другими программистами часто вызывает проблемы. Хотя если это спецкласс, в который вынесены подобные функции для общего использования остальными разработчиками, и меняется в основном только автором, то вариант с промежуточным массивом правильнее, конечно. У нас просто такая специфика, что основные тормоза происходят из-за запросов к большим БД, поэтому остальное требуют писать более удобным в модификации и поддержке, пусть даже в ущерб производительности.
P.S. И часто эта привычка мешает :(
...
Рейтинг: 0 / 0
28.01.2005, 16:21
    #32889830
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро удалить строку из String[ ]?
Зашедший
Придерживаюсь аналогичной позиции. Не стоит оптимизировать то, что не влияет на производительность.

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

Однако разминка для извилин никогда не повредит Ж)
Согласен. Спасибо за напоминание :)
...
Рейтинг: 0 / 0
10.03.2005, 18:44
    #32954278
Зашедший
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро удалить строку из String[ ]?
Кстати, переписывал некоторые свои старые классы, заодно изменил в данном примерчике Vector на ArrayList (в нем методы не синхронизированы) - работа в полтора раза ускорилась :)
...
Рейтинг: 0 / 0
11.03.2005, 09:13
    #32954723
mozheyko_d
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро удалить строку из String[ ]?
Ещё чуть короче и быстрее:
Код: 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
11.03.2005, 12:46
    #32955418
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро удалить строку из String[ ]?
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
11.03.2005, 12:47
    #32955423
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро удалить строку из String[ ]?
естественно, я тестировал исправленный вариант 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
11.03.2005, 12:47
    #32955424
кодо
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро удалить строку из String[ ]?
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
11.03.2005, 12:58
    #32955453
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро удалить строку из String[ ]?
ой, не заметил.
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
Форумы / Java [игнор отключен] [закрыт для гостей] / Как быстро удалить строку из String[ ]? / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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