Удалить определенную строку из массива строк
У меня есть такой массив:
String n[] = {"google","microsoft","apple"};
Что я хочу сделать, так это удалить "яблоко".
Моя проблема очень проста, однако я искал веб-сайт, и я узнал, что java не поддерживает функцию удаления из массива. Я также слышал, как использовать Java Utils, потому что это так просто удалить элемент.... Я пытался найти Java Utils в google, но почти все ссылки мертвы.
Итак, наконец... есть ли способ удалить строку из массива строк?
Даже если я использую ArrayList, я не могу найти способ генерации в нем случайного элемента! Для ex: в обычном массиве я генерирую такую строку:
String r = myAL[rgenerator.nextInt(myAL.length)];
В arraylist это не работает.... может быть, вы знаете решение...
Ответы
Ответ 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);
}
}