Java 快速一:清晰还是简短的代码?

Java 快速一:清晰还是简短的代码?,java,list,collections,Java,List,Collections,好的,正如我承诺的那样,我们开始: 我得到了一段代码,它通过.split(“”)中的标记了中的字符串,所以我分别获取所有字符,然后删除我不想要的字符,目前看起来如下: List<String> op=new ArrayList<String>(Arrays.asList(in.split(""))); op.removeAll(removable); operators=op.toArray(new String[op.size()]); List op=newarra

好的,正如我承诺的那样,我们开始:

我得到了一段代码,它通过.split(“”)中的
标记了
中的字符串
,所以我分别获取所有字符,然后删除我不想要的字符,目前看起来如下:

List<String> op=new ArrayList<String>(Arrays.asList(in.split("")));
op.removeAll(removable);
operators=op.toArray(new String[op.size()]);
List op=newarraylist(Arrays.asList(in.split(“”));
op.removeAll(可拆卸);
operators=op.toArray(新字符串[op.size()]);

其中,
op
是处理删除的临时变量。有没有办法把它放在一行?如果有(请告诉我怎么做,我想了一段时间,我想没有,因为
removeAll()
返回布尔值)-应该这样做还是我应该保持这种方式以便于阅读?

如果你想删除字母,regex将是一个更好的选择。字符串是一个字符数组,您不需要使用列表来处理它

String removable = "[a-zA-Z0-9]";
String operators = in.replaceAll(removable, "");
这将为您提供一个不可移动字符的字符串

如果removable是一个集合,则可以使用将其转换回字符串

String regex = "["+(removable.stream().collect(Collectors.joining()))+"]";
String operators = in.replaceAll(regex, "");
您可以内联
regex
,使其成为一个单行程序


如果您想删除单词,您需要Java8流将其转换为一行程序(除非您编写了一个方法来执行此操作,您可以在一行中调用该方法)

List operators=Stream.of(in.split(“”))
.过滤器->!可移动。包含
.collect(Collectors.toList());
但是,为了使其可读,您仍然使用了三个换行符

这不需要Java 8:

String result = in.replaceAll(removable, "");
(我假设
removable
是一个字符串。)

这是通过用空字符串替换字符串
removable
的每次出现来实现的,本质上就是删除它

注意:

如果
removable
包含一个或多个元字符,则应在其前面加上“\\”。Peter Lawrey有这样一个绝妙的想法:
removable=“[”+removable+”]也适用于大多数元字符

如果希望最终结果是一个
列表
,只需添加
.split(“”)结尾处:

列表结果=in.replaceAll(可移动“”).split(“”)

编辑

正如Peter Lawrey很早就指出的那样,
可移动的
不是字符串。如果您无法将
removable
更改为字符串(我认为这会容易得多),您仍然可以使用以下方法将其转换为字符串:

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("");

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

String[] operators=in.replaceAll("[0-9]", "").split("");
这样,因为我需要它作为字符串数组,但当然,如果我愿意,它也可以作为'List'使用(明天再试):

List op=newarraylist(Arrays.asList(in.replaceAll(“[0-9]”,“”)).split(“”));

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

可移动的
类型是什么?将其更改为:
String result=in.replaceAll(可移动“”
,假设
removable
是一个字符串?@11684
列表。removeAll(集合)
接受一个集合。@PeterLawrey我指的是
字符串#replaceAll
。请注意,
中的
是一个字符串,根据OP.“…将
中的
标记化,
可移动的
也是一个
列表,
replaceAll
也很有用,也许我会发现这个解决方案的用处。我想你误读了这个问题;OP使用
.split(“”
)来获得所有字符的列表,这与在代码片段中对所有空格进行拆分是完全不同的。正则表达式从何而来?问题中没有给出可移动的
的内容。好吧,这基本上就是我想要的,谷歌也没有给我类似的答案。我希望操作符保持为
列表
,现在我知道了如何使其变得简单和友好。
可移除
需要是一个正则表达式。是的,但作为字符串传递。好的,一个字符就是一个有效的正则表达式@PeterLawreyTrue,除非它是
+
或对正则表达式有特殊意义的符号接得好。让我在我的答案中添加一个注释。添加
[
]
将解决大多数符号的问题。
String[] operators=in.replaceAll("[0-9]", "").split("");
List<String> op=new ArrayList<String>(Arrays.asList(in.replaceAll("[0-9]", "").split("")));