我想在Java中将数组转换为Set。有一些明显的方法可以做到这一点(即使用循环),但我想做一些更整洁的事情,比如:

java.util.Arrays.asList(Object[] a);

有什么想法吗?


当前回答

如果需要构建一个内部只有一个元素的不可变集合,可以使用Collections.singleton(…)

Set<String> mySet = Collections.singleton("Have a good day :-)");

这并不能回答最初的问题,但可能对某人有用(至少对我来说是这样)。如果你认为这个答案不合适,告诉我,我会删除它。

其他回答

在完成Arrays.asList(array)之后,可以执行Setset=newHashSet(list);

下面是一个示例方法,您可以编写:

public <T> Set<T> GetSetFromArray(T[] array) {
    return new HashSet<T>(Arrays.asList(array));
}

这样地:

Set<T> mySet = new HashSet<>(Arrays.asList(someArray));

在Java 9+中,如果不可修改集合正常:

Set<T> mySet = Set.of(someArray);

在Java 10+中,可以从数组组件类型推断出泛型类型参数:

var mySet = Set.of(someArray);

小心

Set.of抛出IllegalArgumentException-如果有任何重复someArray中的元素。查看更多详细信息:https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Set.html#of(例如…)

我根据上面的建议写了下面的内容——偷吧……真不错!

/**
 * Handy conversion to set
 */
public class SetUtil {
    /**
     * Convert some items to a set
     * @param items items
     * @param <T> works on any type
     * @return a hash set of the input items
     */
    public static <T> Set<T> asSet(T ... items) {
        return Stream.of(items).collect(Collectors.toSet());
    }
}

对于任何解决Android问题的人:

Kotlin集合解决方案

星号*是排列运算符。它单独应用集合中的所有元素,每个元素按顺序传递给vararg方法参数。相当于:

val myArray = arrayOf("data", "foo")
val mySet = setOf(*myArray)

// Equivalent to
val mySet = setOf("data", "foo")

// Multiple spreads ["data", "foo", "bar", "data", "foo"]
val mySet = setOf(*myArray, "bar", *myArray)

不传递参数setOf()将导致空集。

除了setOf之外,您还可以对特定的哈希类型使用以下任何一种:

hashSetOf()
linkedSetOf()
mutableSetOf()
sortableSetOf()

这是如何显式定义集合项类型的。

setOf<String>()
hashSetOf<MyClass>()

有时使用一些标准库会有很大帮助。尝试查看Apache Commons集合。在这种情况下,您的问题简单地转化为以下内容

String[] keys = {"blah", "blahblah"}
Set<String> myEmptySet = new HashSet<String>();
CollectionUtils.addAll(pythonKeywordSet, keys);

这里是CollectionsUtils javadoc