【问题标题】:Compare two lists with one JAVA Stream do not work [duplicate]将两个列表与一个 JAVA 流进行比较不起作用 [重复]
【发布时间】:2021-10-28 17:08:31
【问题描述】:

我有一个任务:

给出一个正整数序列和一个字符串序列stringList。根据以下规则获取新的字符串序列:对于每个值 n 来自 序列号,从序列stringList中选择一个以数字开头,长度为n的字符串。

如果stringList序列中有多个需要的字符串,则返回第一个;如果没有,则返回字符串“未找到”

例如:

input: {1, 3, 4}, {"1aa", "aaa", "1", "a"}
output: {"1", "1aa", "Not Found"}

我的输出:

[java.util.stream.ReferencePipeline$3@7f690630, 
java.util.stream.ReferencePipeline$3@edf4efb, 
java.util.stream.ReferencePipeline$3@2f7a2457]

我的代码:

(List<Integer> numbers, List<String> stringList) {
return numbers.stream()
        .map(Object::toString)
        .map(value -> (stringList.stream().filter(e -> (Character.isDigit(e.charAt(0)))).map(s -> {
            if (((Object) (s.length())).toString().equals(value)) return s;
            return "Not Found";
}))).map(Object::toString).collect(Collectors.toList());

请帮忙。

【问题讨论】:

  • 使用== 比较引用。要比较 2 个字符串,您必须使用 equals 方法。
  • 感谢建议,代码已更正,但问题依旧

标签: java list lambda java-stream


【解决方案1】:

以下代码使用正则表达式 "\\d.*" 来匹配以数字开头的字符串。

另外,无需将整数值转换为字符串,然后再将此字符串转换回 int 以匹配长度。

public static List<String> task(List<Integer> nums, List<String> strs) {
    return nums.stream()
        .map(i -> strs.stream()
                      //.filter(s -> s.length() == i && i > 0 && Character.isDigit(s.charAt(0)))
                      .filter(s -> s.length() == i && s.matches("\\d.*"))
                      .findFirst() // Optional<String>
                      .orElse("Not Found")
        )
        .collect(Collectors.toList());
}

测试

System.out.println(task(Arrays.asList(1, 3, 4), Arrays.asList("1aa", "aaa", "1", "a")));

输出:

[1, 1aa, Not Found]

更新

为了摆脱嵌套流,应该将字符串列表转换为过滤后的映射,其中长度是键,第一个匹配的字符串是值,然后在流式传输整数列表时使用此映射:

public static List<String> taskFast(List<Integer> nums, List<String> strs) {
    Map<Integer, String> strByLength = strs
        .stream()
        .filter(s -> s.length() > 0 && Character.isDigit(s.charAt(0)))
        .collect(Collectors.toMap(
            String::length,
            s -> s,
            (s1, s2) -> s1 // keep the first match for the same length
        ));

    return nums.stream()
        .map(i -> strByLength.getOrDefault(i, "Not Found"))
        .collect(Collectors.toList());
}

【讨论】:

  • 非常感谢,代码 - 工作。 p.s. Целый день сидел, никак не мог понять как два листа в одном потоке обработать。 Почему-то в книжках этого нет.
  • 如果您的意思是“поток”中的“流”,则在您当前的实现中使用嵌套流(类似于嵌套循环)。最好将字符串列表转换为以项目长度为键的映射,然后使用此映射在没有嵌套流的情况下获取适当的值,检查更新。
  • 谢谢,第一个选项适合我。我需要将所有代码放在一个返回语句中。此外,第一个选项对我来说更能说明问题。
  • @iFlex,如果答案有帮助please accept and/or upvote it
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-19
  • 1970-01-01
  • 2019-12-30
相关资源
最近更新 更多