Java 将长[]更改为集合。错误消息:类型集合中的addAll方法不适用于参数(Set,Long[])
在一个家庭作业中,我被要求在一个名为noDups的现有程序中创建一个方法,该方法可以在不中断顺序的情况下从先前排序的数组中删除重复项。问题还指出,它必须是一个启用的算法,并确保无论有多少重复项,都不会多次移动任何项 我最初尝试使用嵌套for循环来循环并删除重复项,但发现是在^2上。我知道你可以用一套解决这个问题。我尝试编写该方法以接受程序使用的数组类型long[]并将其转换为一个集合,因为集合只包含唯一的值:Java 将长[]更改为集合。错误消息:类型集合中的addAll方法不适用于参数(Set,Long[]),java,arrays,collections,set,hashset,Java,Arrays,Collections,Set,Hashset,在一个家庭作业中,我被要求在一个名为noDups的现有程序中创建一个方法,该方法可以在不中断顺序的情况下从先前排序的数组中删除重复项。问题还指出,它必须是一个启用的算法,并确保无论有多少重复项,都不会多次移动任何项 我最初尝试使用嵌套for循环来循环并删除重复项,但发现是在^2上。我知道你可以用一套解决这个问题。我尝试编写该方法以接受程序使用的数组类型long[]并将其转换为一个集合,因为集合只包含唯一的值: public long[] noDups(long[] target) { //Met
public long[] noDups(long[] target) { //Method for removing duplicates
Set<Long> set = new HashSet<Long>();
Collections.addAll(set, target);
return target;
}
我一直得到标题中所述的错误:
方法addAllCollection,T。。。在类型中
集合不适用于参数集,long[]
之前,我的方法看起来像这样,但我有一个不同的错误:
public void noDups(long[] target){
Set<long> set = new Hashset<long>(Arrays.asList(target));
我是不是初始化错误了?有谁能告诉我如何消除这个错误,或者引导我正确地将long[]转换为Set。谢谢大家! 您不能以您尝试的方式混合基本体和包装器,特别是Collections.addAll只接受长[],在这种情况下不接受长[] 接受你需要做一些循环来来回转换的事实。您需要循环数组并将元素逐个添加到集合中,然后创建一个基本数组并循环集合以将元素放入其中
或者,您可以在现在使用Long[]的任何地方都使用Long[],但这样做效率很低,我会避免在您的位置使用它。如果数组已排序,则不需要嵌套for循环。您应该能够遍历数组一次,并且仅当该项与前一项不同时才添加该项
List<Long> newList = new ArrayList<Long>();
for(Long l : target) {
if(newList.isEmpty() || !l.equals(newList.get(newList.size()-1))) {
newList.add(l);
}
}
newList应包含所有条目,且不包含任何重复项
我手头没有一个编译器来测试这一点,但希望它有意义。您的方法有几个问题: 正如其他人所解释的,您不能将一个仅限集合的集合装箱,请参见Java中的自动装箱,并且不能使用addAll方法将long[]的所有元素添加到集合中 由于必须保留数字的顺序,因此将所有值同时添加到一个集合中是没有帮助的。这将过滤掉重复项,但会丢失排序 由于输入数组已经排序,因此实际上不需要任何额外的数据结构来删除重复项 下面是一种打开的技术,可以在数组的开始处排列唯一值,然后制作数组的有效副本,从而切断不再需要的数组的结束部分:
long[] noDups(long[] nums) {
if (nums.length == 0) return nums;
int pos = 1;
for (int j = 1; j < nums.length; j++) {
if (nums[j - 1] != nums[j]) {
nums[pos++] = nums[j];
}
}
return Arrays.copyOf(nums, pos);
}
如果要从数组中删除重复项,不需要使用HashMap,只需使用Java8流API即可。i、 e
long[] dups = new long[]{1,2,3,4,4,4};
long[] noDups = Arrays.stream(dups).distinct().toArray();