2009-07-15 3 views
2

У меня есть массив строк, и я хочу удалить определенную строку из этого массива. Как я могу это сделать? Мой код:Удаление строки

private void nregexp(){ 
     String str_nregexp = i_exp_nregexp.getText(); 
     boolean b; 
     for(int i=0; i<selectedLocations.length; i++){ 
      b= selectedLocations[i].indexOf(str_nregexp) > 0; 
      if(b){ 
       String i_matches = selectedLocations[i]; 
       ........ 
       ........ 
      } 
     } 
    } 

Я должен удалить i_matches из selectedLocations.

+0

Вы хотите найти массив? Вы уже знаете, что такое строка? Вы хотите, чтобы новый массив был на один элемент меньше? Вы хотите, чтобы массив остался с отверстием? и т. д. – Smalltown2k

+0

Дубликат http://stackoverflow.com/questions/112503/how-do-remove-objects-from-an-array-in-java – skaffman

+0

http://stackoverflow.com/questions/112503/how- делать-я-удалить-объекты из--ан-массив-в-Java – Ezombort

ответ

0

Не могли бы вы показать нам свой код? Почему бы вам не использовать ArrayList, поскольку он имеет поддержку remove (index) и remove (object)?

Edit: Возможно

private void nregexp() { 
    String str_nregexp = i_exp_nregexp.getText(); 
    boolean b; 
    List<String> list = new ArrayList<String>(Arrays.asList(selectedLocations)); 
    for(Iterator<String> it = list.iterator(); i.hasNext();){ 
     String e = it.next(); 
     b = e.indexOf(str_nregexp) > 0; 
     // b = e.matches(str_regexp); // instead? 
     if(b){ 
      String i_matches = s; 
      it.remove(); // we don't need it anymore 
      ........ 
      ........ 
     } 
    } 
    selectedLocations = list.toArray(new String[list.size()]); 
} 
1

Вам нужно будет скопировать массив меньшего массива, опуская строку, которую вы не хотите. Если это обычная ситуация, вы должны рассмотреть возможность использования чего-то другого, кроме массива, например LinkedList или ArrayList.

2

Это зависит от того, что вы подразумеваете под «удалением определенной строки из массива». Если вы хотите удалить его значение, вы можете просто установить его значение равным null, однако если вы имеете в виду фактически удалить этот элемент из массива (у вас есть массив из 5 элементов, и вы хотите получить результат после удаления элемента 4), это невозможно без копирования массива с удаленным элементом.

Если вы хотите этого, вы можете захотеть взглянуть на динамический список, такие как ArrayList или LinkedList

Edit: Если вы хотите простой способ, чтобы скопировать массив в массив с строки удалены, вы можете сделать что-то вроде:

List<Foo> fooList = Arrays.asList(orgArray); 
fooList.remove(itemToRemove); 
Foo[] modifiedArray = fooList.toArray(); 
0

Вы не можете изменить длину массива после инициализации массива, длина которого установлена. Таким образом, вы не можете удалить элемент напрямую, его можно заменить только нулевым.

String[] arr = new String[10]; 
// fill array 
... 
// replace the fifth element with null 
arr[4] = null; 

Если вы хотите изменить длину массива, вы должны попробовать список вместо:

List<String> list = new ArrayList<String>(); 
// fill list 
... 
// remove the fifth element 
list.remove(4); 
1

Если вы действительно хотите сделать это самостоятельно, вот пример:

import java.util.Arrays; 
public class DelStr { 
    public static String[] removeFirst(String[] array, String what) { 
     int idx = -1; 
     for (int i = 0; i < array.length; i++) { 
      String e = array[i]; 
      if (e == what || (e != null && e.equals(what))) { 
       idx = i; 
       break; 
      } 
     } 
     if (idx < 0) { 
      return array; 
     } 
     String[] newarray = new String[array.length - 1]; 
     System.arraycopy(array, 0, newarray, 0, idx); 
     System.arraycopy(array, idx + 1, newarray, idx, array.length - idx - 1); 
     return newarray; 
    } 
    public static void main(String[] args) { 
     String[] strings = { "A", "B", "C", "D" }; 
     System.out.printf("Before: %s%n", Arrays.toString(strings)); 
     System.out.printf("After: %s%n", 
      Arrays.toString(removeFirst(strings, "D"))); 
    } 
} 
0

Я достиг такого решения, которое позволяет удалить все элементы, равные элементу удаления:

private static <T> T[] removeAll(T[] array, T element) { 
    if (null == array) 
     throw new IllegalArgumentException("null array"); 
    if (null == element) 
     throw new IllegalArgumentException("null element"); 

    T[] result = (T[]) Array.newInstance(array.getClass().getComponentType(), array.length); 

    int j = 0; 
    for (int i = 0; i < array.length; i++) { 
     if (!element.equals(array[i])) 
      result[j++] = array[i]; 
    } 
    return Arrays.copyOf(result, j); 
} 

Я также сделал некоторый бенчмаркинг, и это решение, безусловно, лучше, чем использование списков. Хотя, если производительность здесь не проблема, я бы использовал списки.

Если вам действительно нужно удалить только один элемент (первый), у @kd304 есть решение проблемы.

Смежные вопросы