繁体   English   中英

从JAVA中的列表的每个项目中删除一个字符

[英]Remove a character from every item of a list in JAVA

我有一个像这样的字符串"-FOREST&-JUNGLE&DESERT"
此字符串在列表中拆分为单词,如下所示: [-FOREST, -JUNGLE ,DESERT]
List<String> pattern = Arrays.asList(s.split("\\\\s*&\\\\s*"));

每个开头带减号的单词都必须在一个新列表中,每个单词都必须在另一个列表中,如下所示:

List<String> allowedtags = pattern
                            .stream()
                            .filter(name -> !name.startsWith("-"))
                            .collect(Collectors.toList());

List<String> unwantedtags = pattern
                            .stream()
                            .filter(name -> name.startsWith("-"))
                            .collect(Collectors.toList());

我的问题是我unwantedtags的标签在开头保留带有减号的单词,但是对于我的所有操作,我需要摆脱它。 如果我做下面的例子中,如果“林”是它不会工作taglist作为我unwantedtags包含“-Forest”。

if (taglist.stream().anyMatch(unwantedtags::contains)) {
                        return !IsWhitelist;
                        }

那么如何修复我不需要的标签列表呢? 也许在java 8流api中? 此外,我觉得一方面它在这一点上工作得很好,但另一方面我觉得这是很多代码来获取两个列表。 可以优化吗?

您可以映射每个元素以在检测到它后去掉前导减号:

List<String> unwantedtags = pattern
                            .stream()
                            .filter(name -> name.startsWith("-"))
                            .map(name -> name.substring(1))
                            .collect(Collectors.toList());

通过显式构造和填充列表,可以使代码更加高效。 然后您可以一次处理pattern而不是两次:

List<String> allowedtags = new ArrayList();
List<String> unwantedtags = new ArrayList();
pattern.stream()
       .forEach(name -> {
                if (name.startsWith("-")) unwantedtags.add(name.substring(1));
                else allowedtags.add(name);
            }
        );

您缺少一个操作。 使用 map() 运算符,您可以获取输入字符串并对其进行修改。

List<String> unwantedtags = pattern
                .stream()
                .filter(name -> name.startsWith("-"))
                .map(name -> name.substring(1))
                .collect(Collectors.toList());

您可以使用groupingBy来划分此集合(按name.startsWith("-") ):

Map<Boolean, List<String>> collect = pattern.stream()
        .collect(Collectors.groupingBy(name -> name.startsWith("-")));

然后你有:

{false=[DESERT], true=[-FOREST, -JUNGLE]}

之后,您可以进行进一步处理(使用unwantedtags ):

List<String> unwantedtags = collect
        .getOrDefault(true, List.of()).stream()
        .map(name -> name.substring(1))
        .collect(Collectors.toList());

或者您可以在一个流中完成,但它看起来可能更复杂。

Map<Boolean, List<String>> collectWithMap = pattern.stream()
        .collect(Collectors.groupingBy(name -> name.startsWith("-"),
                Collectors.mapping(name -> name.startsWith("-") ? name.substring(1) : name, 
                        Collectors.toList())));

结果:

{false=[DESERT], true=[FOREST, JUNGLE]}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM