it-swarm.com.ru

Удалить конкретную строку из массива строк

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

String n[] = {"google","Microsoft","Apple"};

Что я хочу сделать, это удалить «Apple». 

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

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

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

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

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

17
user1015311

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

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

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

или же

myStringArray[indexOfStringToRemove] = null;

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

myArrayList.remove(stringToRemove); 

или же 

myArrayList.remove(indexOfStringToRemove);

Редактировать в ответ на редактирование OP на его вопрос и комментарий ниже

String r = myArrayList.get(rgenerator.nextInt(myArrayList.size()));
26
Brian Roach

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

      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++;
        }      
      }

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

9
LuisKarlos

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

1
Seva Alekseyev

Вы не можете ничего удалить из массива - они всегда имеют фиксированную длину. Как только вы создали массив длиной 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
Jon Skeet
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);
    }
}
0
user2907433