簡體   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