我有一个HashSet<Integer>
,里面有一堆Integers
。我想把它变成一个数组,但是调用
hashset.toArray();
返回Object[]
。除了手动迭代每个元素之外,还有更好的方法将它转换为int
数组吗?我想将数组传递给
void doSomething(int[] arr)
不接受Object []数组,即使我尝试像
那样进行转换doSomething((int[]) hashSet.toArray());
答案 0 :(得分:20)
Apache的ArrayUtils有这个(它仍然迭代behind the scenes):
doSomething(ArrayUtils.toPrimitive(hashset.toArray()));
他们总是一个检查这类事情的好地方。
答案 1 :(得分:17)
您可以使用Java 8流从任何int[]
(包括Collection<Integer>
)创建HashSet<Integer>
:
int[] array = coll.stream().mapToInt(Number::intValue).toArray();
当然,库仍在代表您迭代集合(或其他流源)。
除了简洁且没有外部库依赖关系之外,如果你有一个非常大的集合要复制,流也可以让你并行。
答案 2 :(得分:5)
public int[] toInt(Set<Integer> set) {
int[] a = new int[set.size()];
int i = 0;
for (Integer val : set) a[i++] = val;
return a;
}
既然我已经为你编写了代码,那就不再是那本手册,不是吗? ;)
答案 3 :(得分:4)
即使没有Apache Utils,您也可以将Set<Integer>
转换为Integer[]
:
Set<Integer> myset = new HashSet<Integer>();
Integer[] array = myset.toArray(new Integer[0]);
但是,如果您需要int[]
,则必须迭代该集。
答案 4 :(得分:4)
你可以使用番石榴:
Ints.toArray(Collection<? extends Number> collection)
答案 5 :(得分:2)
都能跟得上;你必须迭代它们。遗憾。
答案 6 :(得分:0)
尝试一下。 使用Java 8。
Set<Integer> set = new HashSet<>();
set.add(43);
set.add(423);
set.add(11);
set.add(44);
set.add(56);
set.add(422);
set.add(34);
int[] arr = set.stream().mapToInt(Integer::intValue).toArray();
答案 7 :(得分:-4)
您还可以使用toArray()方法的toArray(T [] contents)变体。创建一个与HashSet大小相同的空数组,然后将其传递给toArray()方法:
Integer[] myarray = new Integer[hashset.size()];
doSomething(hashset.toArray(myarray));
您必须将doSomething()
功能更改为接受Integer[]
数组而不是int[]
。如果这不可行,您可以将toArray
返回的值数组转换为int[]
。