从字符串数组中移除特定的字符串

20

我有一个这样的数组:

String n[] = {"google","microsoft","apple"};
我想做的是删除“apple”。
我的问题很基础,但我在网站上搜索后发现Java并不真正支持从数组中删除元素的功能。我还听说要使用Java Utils,因为它很容易删除一个项目... 我试图在Google上找到Java Utils,但几乎所有链接都已失效。
所以最终...有没有办法从字符串数组中删除一个字符串?
即使我使用ArrayList,我也找不到生成其中一个随机项的方法!例如:在普通数组中,我会这样生成一个字符串:
String r = myAL[rgenerator.nextInt(myAL.length)];

在ArrayList中它不起作用...也许你知道一个解决方案...


你可能被引用到了java.util包,其中包含一些下面的人在回答你问题时使用的类,比如ListArrayList,这些类都是标准Java库中自带的,不需要单独下载。 - Giulio Piancastelli
7
不行!你想要移除微软。 - Martijn Courteaux
5个回答

28

定义"remove"。

数组长度是固定的,创建后无法调整大小。您可以将元素设置为 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);

针对问题作者的编辑和下方评论的修改

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

可以,但我还需要从列表中生成一个随机项...在普通数组中很容易实现,但在ArrayList中却很困难...如果您知道如何实现,请告诉我... - user1015311
为什么这个“难做”?ArrayList通过索引提供了与数组相同的随机访问。请参见我上面的编辑。 - Brian Roach
1
我建议使用 (myStringArray[i].equalsIgnoreCase(stringToRemove))。这将确保无论用户输入的类型如何,大小写都不会阻止字符串从数组中被删除。 - Fergus

9

无法一步完成,或者您需要保留对数组的引用。 如果可以更改引用,则可以帮助解决问题:

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

我不建议这样做,因为代码会更难以阅读和维护。


更不用说效率极低了,所有的复制都是有代价的。这就是为什么ArrayList被发明出来的原因。 - Brian Roach

1

你无法从数组中删除任何内容 - 它们始终具有固定的长度。一旦你创建了一个长度为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);
}

没问题,但我还需要从列表中生成一个随机项...在普通数组中很容易实现,但在ArrayList中却很难...如果您知道如何,请告诉我... - user1015311
@user1015311:不,你可以像处理数组一样处理它 - 只需根据索引而不是值进行删除。有一个重载的 remove 方法接受一个 int 参数。只需在范围 [0,list.size()] 中创建一个随机数,然后调用 list.remove(index); 即可。 - Jon Skeet

1
在Java中,数组不是动态的,就像集合类一样。如果你想要一个真正支持动态添加和删除的集合,请使用ArrayList<>。如果你仍然想使用普通数组,请找到字符串的索引,构造一个比原来少一个元素的新数组,然后使用System.arraycopy()复制前后的元素。或者手写一个跳过的复制循环,在小数组上差别将会是可忽略的。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接