Java 将长[]更改为集合。错误消息:类型集合中的addAll方法不适用于参数(Set,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

在一个家庭作业中,我被要求在一个名为noDups的现有程序中创建一个方法,该方法可以在不中断顺序的情况下从先前排序的数组中删除重复项。问题还指出,它必须是一个启用的算法,并确保无论有多少重复项,都不会多次移动任何项

我最初尝试使用嵌套for循环来循环并删除重复项,但发现是在^2上。我知道你可以用一套解决这个问题。我尝试编写该方法以接受程序使用的数组类型long[]并将其转换为一个集合,因为集合只包含唯一的值:

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();