快一:清晰度还是短代码?

时间:2014-07-26 23:08:56

标签: java list collections

好的,正如我所承诺的那样快,我们走了:

我得到的代码片段只是用in标记字符串in.split("");,所以我分别得到所有字符,然后删除那些我不想要的字符,目前它看起来像这样: / p>

List<String> op=new ArrayList<String>(Arrays.asList(in.split("")));
op.removeAll(removable);
operators=op.toArray(new String[op.size()]);

其中op是我处理删除的临时变量。有没有办法把它放在一行?如果有的话(请告诉我如何,我想知道一段时间,我认为没有因为removeAll()返回布尔值) - 它应该完成还是应该保持这种方式以使其更容易阅读?

3 个答案:

答案 0 :(得分:1)

需要Java 8:

String result = in.replaceAll(removable, "");

(我假设removable是一个字符串。)

这可以通过将每个字符串removable替换为空字符串来实现,基本上将其删除。

注意:

如果removable包含(a)元字符,则应在其前面加上“\\”。 Peter Lawrey有这样一个好主意:removable = "[" + removable + "]";对大多数元字符都有效。

如果您希望最终结果为List<String>,则最后可以添加.split("");

列出结果= in.replaceAll(可移除,“”)。split(“”);

修改

正如Peter Lawrey很早就指出的那样,removable不是一个字符串。如果你以某种方式无法将removable更改为String(我认为会更容易),您仍然可以使用它将其转换为字符串:

StringBuilder sb = new StringBuilder();
sb.append("[");
for (String s : removable) {
  sb.append(s);
}
sb.append("]");
String removableString = sb.toString();

(正则表达式需要括号([]),它们基本上是指“匹配我们之间的任何字符”。)

您使用removable从单字符串字符串列表中删除项目,因此我假设removable的所有项目也是单字符串字符串。如果不是这样,那么您将for循环内的行更改为sb.append("(").append(s).append(")");。 使用字符串,您最终可以:

in.removeAll(removable, "").split("");

答案 1 :(得分:0)

如果你想删除字母,正则表达式将是一个更好的选择。 String是一个字符数组,您不需要使用List来处理它。

String removable = "[a-zA-Z0-9]";
String operators = in.replaceAll(removable, "");

这为您提供了一个不可移动字符的字符串。

如果可移动是一个集合,你可以将它变回一个带有的字符串。

String regex = "["+(removable.stream().collect(Collectors.joining()))+"]";
String operators = in.replaceAll(regex, "");

您可以内联regex使其成为单行。


如果你想删除单词,你需要Java 8流来将它变成一个单行(除非你编写一个方法来执行此操作,你可以在一行中调用)

List<String> operators = Stream.of(in.split(" "))
                               .filter(s -> !removable.contains(s))
                               .collect(Collectors.toList());

但是,为了使其可读,您仍然最终使用三个换行符。 ;)

答案 2 :(得分:0)

好的,至于可读性,它仍然不清楚,取决于个人的感觉彼得劳里和11684答案让我找到解决方案,这是在我眼前。我正在使用removable创建for以通过ascii代码添加我想要处理的所有字符,但正如所指出的那样,小正则表达式会好上千倍。首先,我只想删除数字,但如果需要,我会在以后继续清理整个输入。

String[] operators=in.replaceAll("[0-9]", "").split("");
这样,因为我需要它作为String数组,但当然它也可以作为`List&#39;如果我想(明天再试):

List<String> op=new ArrayList<String>(Arrays.asList(in.replaceAll("[0-9]", "").split("")));

它是一个班轮。但是,我认为除了作者之外,任何人都不容易阅读。