当前位置: 首页 > 面试题库 >

从集合中返回唯一元素的正确方法

容阳焱
2023-03-14
问题内容

我有以下几种情况:

Set<Element> set = getSetFromSomewhere();
if (set.size() == 1) {
    // return the only element
} else {
    throw new Exception("Something is not right..");
}

假设我无法更改的返回类型getSetFromSomewhere(),是否有比此方法返回更好的或更正确的方法来返回集合中的唯一元素?

  • 遍历集合并立即返回
  • 从集合中创建列表并调用 .get(0)

问题答案:

您可以使用Iterator来获取唯一元素,也可以验证集合仅包含一个元素(从而避免size()调用和不必要的列表创建):

Iterator<Element> iterator = set.iterator();

if (!iterator.hasNext()) {
    throw new RuntimeException("Collection is empty");
}

Element element = iterator.next();

if (iterator.hasNext()) {
    throw new RuntimeException("Collection contains more than one item");
}

return element;

您通常将其包装在自己的方法中:

public static <E> E getOnlyElement(Iterable<E> iterable) {
    Iterator<E> iterator = iterable.iterator();

    // The code I mentioned above...
}

请注意,此实现已经是Google的Guava库的一部分(即使您不将其用于此特定代码,我也 强烈
建议这样做)。更具体地说,该方法属于以下Iterables类:

Element element = Iterables.getOnlyElement(set);

如果您对它的实现方式感到好奇,可以查看Iterators类源代码Iterables经常调用方法中的方法Iterators):

  /**
   * Returns the single element contained in {@code iterator}.
   *
   * @throws NoSuchElementException if the iterator is empty
   * @throws IllegalArgumentException if the iterator contains multiple
   *     elements.  The state of the iterator is unspecified.
   */
  public static <T> T getOnlyElement(Iterator<T> iterator) {
    T first = iterator.next();
    if (!iterator.hasNext()) {
      return first;
    }

    StringBuilder sb = new StringBuilder();
    sb.append("expected one element but was: <" + first);
    for (int i = 0; i < 4 && iterator.hasNext(); i++) {
      sb.append(", " + iterator.next());
    }
    if (iterator.hasNext()) {
      sb.append(", ...");
    }
    sb.append('>');

    throw new IllegalArgumentException(sb.toString());
  }


 类似资料:
  • 问题内容: 我有一个Python,我将根据条件从中逐个删除元素。当集合只剩下1个元素时,我需要返回该元素。如何从集合中访问此元素? 一个简化的例子: 问题答案: 用途: 在您的情况下,它将是: 但是请注意,这将从集合中删除该项目。如果不希望这样做,则可以使用| : 演示:

  • srandmember key 同spop,随机取set中的一个元素,但是不删除元素

  • 这是一个算法问题。如果我错过了Python中任何有帮助的现有函数,请大喊一声。 给定一组元素的,我们可以在Python中使用函数来找到所有唯一的k元素子集。让我们调用包含所有这些子集的集合。请注意,每个这样的子集都有不同的元素。 问题是两步走。首先,给定这些k-不同元素子集,我想组合(其中的一些),这样(组合只是一些子集的超集): > 构图中任意两个子集之间的交集为空 构图中所有子集的并集给出的正

  • spop key 如果set是空或者key不存在返回nil

  • 数组: 我想得到元素的索引。所以,我在循环它。 电流输出 我错在哪里?