从字符串数组中删除空字符串

3
public static String[] removeString (String[] original) { 
  String[] newString; 
  List<String> list = new ArrayList<String>(Arrays.asList(original)); 

  list.remove(0); 
  newString = list.toArray(original); 
  return newString; 
}

我试图使用上述代码从字符串数组中删除第一个字符串;但是,尽管我成功地从数组中删除了第一个字符串,但我也使得数组中的最后一个字符串变成了null。如何缩短数组本身?


据我所知,那段代码应该可以工作...也许直接使用数组列表的引用而不是List接口会更好。 - Daniel Bingham
这很奇怪...我的另一个评论去哪了?挠头 - Daniel Bingham
@Alcon:在元数据中迷失了吗?自从这个问题首次发布以来,我的回答就在那里丢失了 :-/ - user85421
@Carlos 哈哈,是的...抱歉,我一开始在错误的地方注册了。 - wrongusername
3个回答

4

您需要使用java.util.ArraysT[] copyOfRange(T[] original, int from, int to) 方法


(注:此方法可以帮助您复制数组中指定范围的元素。)
public static String[] RemoveString (String[] Original) { 
    return Arrays.copyOfRange(original, 1, original.length);
}

(+1) 确实,这是一个优雅的解决方案。 - Bozho
对于想要使用copyOfRange的人,请注意:此方法自Java 1.6版本以后可用。 - sateesh

4

将上一个代码行修改为:

NewString = list.toArray(new String[list.size()]);
toArray(..)方法接受一个列表作为参数,并尝试使用列表数据填充它。您正在传递长度为3的列表,因此最后一个元素保持为空。按照我的建议,您可以创建一个新数组,其大小与列表的新大小相同。
顺便说一句:我建议您重新审查命名约定。根据推荐的命名约定,您的方法和变量名称应以小写字母开头。
更新:但是,最好像其他人建议的那样使用Arrays.copyOfRange(..)

谢谢!那个很有效。谢谢你告诉我关于命名规范的事情 :) - wrongusername
我可以问一下你为什么要使用数组吗? - Viktor Klang
请在问题下方提出问题,这样作者更有可能看到。尽管问题并不太相关 :) - Bozho

0
问题在于,由于您的新数组比旧数组小,因此新数组会被复制到旧数组中。然后,剩余的字段将填充为 null。这很丑陋,但可以解决您的问题:
public static String[] RemoveString (String[] Original) { 
  List<String> list = new ArrayList<String>(Arrays.asList(Original)); 

  list.remove(0); 
  return list.toArray(new String[0]);
 }

编辑 或者按照Bozho所说的做,他的代码更好。

编辑2 根据下面的评论进行更改。


你怎么知道原字符串长度大于1?它为什么不能有长度为1的情况呢?那样你的代码会返回长度为1的数组,显然是不正确的。为什么不把一个新的String[0]传递给toArray()呢? - meriton
我感觉很愚蠢,你说得完全正确。我在第一个可行的解决方案上停止了思考。 - ddccffvv

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