【问题标题】:Removing last elements of a list if they match a pattern [closed]如果列表的最后一个元素与模式匹配,则删除它们[关闭]
【发布时间】:2019-05-29 02:57:09
【问题描述】:

给定一个数字字符串列表[1,3,5,0,2,0,0,0]。有没有办法删除最后一个 0,以获取[1,3,5,0,2],如果可能的话使用流。

【问题讨论】:

  • 你的意思是重复号码?
  • 我只想去掉最后三个0,不去掉不在列表末尾的0。
  • 这只是一个例子,最后可能是不同数字的0。
  • ...到目前为止,您尝试了什么?

标签: java filter java-8 java-stream


【解决方案1】:

我认为在这种情况下您没有理由使用流。下面的 sn-p 简短而简单。我会向你推荐这种方式。

    String[] stringarray = { "1", "3", "5", "0", "2", "0", "0", "0" };

    List<String> strings = new ArrayList<>(Arrays.asList(stringarray));

    while (strings.get(strings.size() - 1).equals("0")) {
        strings.remove(strings.size() - 1);
    }

【讨论】:

  • int count = 2; while (strings.get(strings.size() - 1).equals("0") &amp;&amp; count&gt;=0 ) { count--; strings.remove(strings.size() - 1); } 因为不适用于{ "1", "3", "5", "0", "2", "0", "0", "0","0" }
【解决方案2】:

如果您至少在 java9 上:

List<String> inputList = ...
Predicate<String> predicate = ...

List<String> result = new ArrayList<>(inputList);
Colledtions.reverse(result);
result = result.stream
    .dropWhile(predicate)
    .collect(toList());

【讨论】:

  • 谢谢,很有趣,但我只运行 Java8,不能使用 dropWhile。无论如何你是对的,反向机制在这里可能很有用。
  • 或者你甚至可以在你的字符串匹配时从 input 和 pop() 创建一个 Deque
【解决方案3】:

一个简单的解决方案

String[] stringarray = { "1", "3", "5", "0", "2", "0", "0", "0" };
int count = 0;

             for(int i = stringarray.length; i > 0; i--) {
                 if("0".equals(stringarray[i-1])) {
                     count ++;
                 } else {
                     break;
                 }
             }

 String[] result = Arrays.copyOf(stringarray, stringarray.length - count);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多