【问题标题】:HashSet of Strings and retrieval of only the first word of each element字符串的 HashSet 和仅检索每个元素的第一个单词
【发布时间】:2020-02-25 00:06:23
【问题描述】:

如果我有一个HashSet<String>,我怎样才能只检索集合中每个元素的第一个单词?

【问题讨论】:

  • HashSet 不保证任何订单,因此没有理由这样做。
  • 您可以使用 Hashset 返回的迭代器,但如果必须使用集合,使用 TreeSet 可能更有效。
  • 您所说的“第一个”字究竟是什么意思?是 A) 添加到 Set 的第一个单词,B) 按字母顺序排列的第一个单词,C) 迭代 Set 时遇到的第一个单词?D) 其他什么?
  • @user12956826 “每个字符串的第一个单词”与集合的第一个元素完全不同。你换个问题。最好问一个新问题。你问how to iterate the set?还是你问how to get first word of a string,这与集合无关
  • @user12956826 这实际上是一个不同的问题,因为您不需要知道第一个单词,只要有匹配项即可。即像boolean found = set.stream().anyMatch(s -> s.startsWith(searchWord)).isPresent(); 这样的东西会做。

标签: java string split hashset


【解决方案1】:

要检索集合中每个字符串的第一个单词,请尝试以下操作:

Collection<String> firstWords = set.stream()
    .map(s -> s.split(" ")[0]) // split on spaces, take first element of the split
    .collect(Collectors.toSet());

如果要保留重复项,请将Collectors.toSet() 更改为Collectors.toList()

【讨论】:

    【解决方案2】:

    你可以像这样获取集合的第一个元素:

    if (! set.isEmpty()) {
        first = set.iterator().next();
    }
    

    但是,对于 HashSet,“第一个”元素是任意的,因为它们是无序的,或者正如 javadoc 所说:

    它不保证集合的迭代顺序;特别是,它不保证订单会随着时间的推移保持不变。

    除了HashSet,您可以使用LinkedHashSet,它保持插入顺序,或TreeSet排序,所以在这两种情况下“第一”是明确定义的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多