удаление строки - PullRequest
2 голосов
/ 15 июля 2009

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

 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.

Ответы [ 6 ]

2 голосов
/ 15 июля 2009

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

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

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

List<Foo> fooList = Arrays.asList(orgArray);
fooList.remove(itemToRemove);
Foo[] modifiedArray = fooList.toArray();
1 голос
/ 15 июля 2009

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

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")));
    }
}
1 голос
/ 15 июля 2009

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

0 голосов
/ 15 июля 2009

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

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 есть решение.

0 голосов
/ 15 июля 2009

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

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);
0 голосов
/ 15 июля 2009

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

Редактировать: Возможно

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()]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...