Удалить конкретную строку из массива строк - PullRequest
17 голосов
/ 29 октября 2011

У меня есть такой массив:

String n[] = {"google","microsoft","apple"};

Я хочу удалить «яблоко».

Моя проблема очень проста, однако я искал веб-сайт и обнаружил, что java на самом деле не поддерживает функцию удаления из массива. Я также слышал об использовании Java Utils, потому что его так просто удалитьэлемент .... Я пытался найти Java Utils в Google, но почти все ссылки мертвы.

Итак, наконец ... есть ли способ удалить строку из массива строк?

Даже если я использую ArrayList, я не могу найти метод для создания случайного элемента в нем!Например, в обычном массиве я генерирую строку, подобную этой:

String r = myAL[rgenerator.nextInt(myAL.length)];

В массиве не работает .... может быть, вы знаете решение ...

Ответы [ 5 ]

26 голосов
/ 29 октября 2011

Определить "удалить".

Массивы имеют фиксированную длину и не могут быть изменены после создания. Вы можете установить элемент на null, чтобы удалить ссылку на объект;

for (int i = 0; i < myStringArray.length(); i++)
{
    if (myStringArray[i].equals(stringToRemove))
    {
        myStringArray[i] = null;
        break;
    }
}

или

myStringArray[indexOfStringToRemove] = null;

Если вам нужен массив динамического размера, в котором объект фактически удален и размер списка (массива) соответствующим образом скорректирован, используйте ArrayList

myArrayList.remove(stringToRemove); 

или

myArrayList.remove(indexOfStringToRemove);

Правка в ответ на правку ОП на его вопрос и комментарий ниже

String r = myArrayList.get(rgenerator.nextInt(myArrayList.size()));
9 голосов
/ 29 октября 2011

Невозможно выполнить шаг, или вам нужно сохранить ссылку на массив.Если вы можете изменить ссылку, это может помочь:

      String[] n = new String[]{"google","microsoft","apple"};
      final List<String> list =  new ArrayList<String>();
      Collections.addAll(list, n); 
      list.remove("apple");
      n = list.toArray(new String[list.size()]);

Я не рекомендую следующее, но если вы беспокоитесь о производительности:

      String[] n = new String[]{"google","microsoft","apple"};
      final String[] n2 = new String[2]; 
      System.arraycopy(n, 0, n2, 0, n2.length);
      for (int i = 0, j = 0; i < n.length; i++)
      {
        if (!n[i].equals("apple"))
        {
          n2[j] = n[i];
          j++;
        }      
      }

Я не рекомендую это, потому что код многотруднее читать и поддерживать.

1 голос
/ 29 октября 2011

Вы не можете ничего удалить из массива - они всегда имеют фиксированную длину. После того, как вы создали массив длиной 3, этот массив всегда будет иметь длину 3.

Вы бы лучше с List<String>, например ArrayList<String>:

List<String> list = new ArrayList<String>();
list.add("google");
list.add("microsoft");
list.add("apple");
System.out.println(list.size()); // 3

list.remove("apple");
System.out.println(list.size()); // 2

Подобные коллекции, как правило, гораздо более гибкие, чем работа с массивами напрямую.

РЕДАКТИРОВАТЬ: Для удаления:

void removeRandomElement(List<?> list, Random random)
{
    int index = random.nextInt(list.size());
    list.remove(index);
}
1 голос
/ 29 октября 2011

Массивы в Java не являются динамическими, как классы коллекций.Если вы хотите настоящую коллекцию, которая поддерживает динамическое добавление и удаление, используйте ArrayList <>.Если вы все еще хотите жить с ванильными массивами, найдите индекс строки, создайте новый массив размером на один меньше исходного и используйте System.arraycopy() для копирования элементов до и после.Или напишите цикл копирования с пропуском вручную, для небольших массивов разница будет незначительной.

0 голосов
/ 22 октября 2013
import java.util.*;

class Array {
    public static void main(String args[]) {
        ArrayList al = new ArrayList();
        al.add("google");
        al.add("microsoft");
        al.add("apple");
        System.out.println(al);
        //i only remove the apple//
        al.remove(2);
        System.out.println(al);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...