Подтвердить что ты не робот

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

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

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

Что я хочу сделать, так это удалить "яблоко".

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

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

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

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

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

4b9b3361

Ответ 1

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

Массивы фиксированной длины и не могут быть изменены после создания. Вы можете установить элемент 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()));

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

Вам будет лучше с List<String>, например. a 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

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

EDIT: для удаления:

void removeRandomElement(List<?> list, Random random)
{
    int index = random.nextInt(list.size());
    list.remove(index);
}

Ответ 5

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