【问题标题】:Get the only element in a Set获取 Set 中的唯一元素
【发布时间】:2017-04-22 19:09:14
【问题描述】:

如果只有一个条目,我需要知道在 Set 中获取值的“最佳”和最安全的方法。 methodToGetValues() 广泛用于读取配置文件并返回给定特定键的值列表,在本例中为 "enabled"。对于enabled 键,Set 中应该只返回一个条目,显然是"true""false",但是会发生错误。我有以下看起来有点令人费解的:

Set<String> enabled = methodToGetValues("enabled");

if (!enabled.isEmpty() && enabled.size() < 2 && "true".equals(enabled.iterator().next())) {
    ...
}

谁能建议一种更简单但仍然可靠的检查方法?

【问题讨论】:

  • 为什么你有一个只有一个元素的集合?我只是想知道,因为我觉得这可能是一个 XY 问题。
  • 对于其他键,读取配置文件时返回的值是多个,所以Set会有更多的元素。
  • 为什么不为这种类型的值写一个新的methodToGetValue呢?
  • 你所拥有的看起来不错,但如果你可以使用第三方库 Guava 的 Iterables.getOnlyElement 几乎是为这个用例定制的。
  • @LouisWasserman 这正是我所追求的,谢谢。

标签: java iterator set


【解决方案1】:

你的问题要求从系列中得到一些东西。但是您的示例只需要检查一下。

如果您知道在 Set 中会发生什么,这很好。

    if (enabled != null && enabled.size() == 1 && enabled.contains("true")) {
        ...
    }

否则,如果您只想获取元素但不知道它是什么,您建议的迭代器可以正常工作。

    String getOnlyElement(Set<String> enabled, String default) {
        return (enabled == null || enabled.size() != 1) ? default : enabled.iterator().next();
    }

我喜欢进行空检查,但这取决于 methodToGetValues 返回的内容。

【讨论】:

    【解决方案2】:
    public Set<String> getValues(final String key){
        .....
    }
    
    public String getValue(final String key) {
        final Set<String> values = getValues(key);
        if (values == null || values.size() != 1) {
            throw new IllegalStateException("Invalid configuration for give key :" + key);
        }
    
        return values.iterator().next();
    }
    
    public Boolean getValueAsBoolean(final String key) {
        return Boolean.valueOf(getValue(key));
    }
    

    您可以将方法修改为具有接受参数以在未找到键时返回默认值。您可以添加不同的方法来返回特定类型的对象,如 inte、boolean,这样代码看起来更干净

    【讨论】:

      【解决方案3】:

      不确定使用Set&lt;String&gt; 来处理此数据的用例是什么,但这里有一个选项:

      // check size = 1 over two checks,  use contains rather than grabbing an iterator
      if (set.size() == 1 && set.contains("true")) {
          ...    
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-09
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多