簡體   English   中英

將long []更改為Set。 錯誤消息:Collections類型中的方法addAll不適用於自變量(設置 <Long> , 長[])

[英]Changing a long[] into a Set. Error message: The method addAll in the type Collections is not applicable for the arguments (Set<Long>, long[])

在一項作業分配中,要求我在現有程序中創建一個名為noDups()的方法,該方法可從先前排序的數組中刪除重復項,而不會破壞順序。 該問題還指出,它必須是具有O(N)的算法,並且確保無論有多少重復項,都不會移動任何項目一次以上。

我最初嘗試使用嵌套的for循環來循環並刪除重復項,但發現那是O(N ^ 2)。 我了解到您可以使用Set解決此問題。 我嘗試編寫該方法以接受long [](程序使用的數組類型)數組並將其轉換為集合,因為集合僅包含唯一值:

public long[] noDups(long[] target) { //Method for removing duplicates

        Set<Long> set = new HashSet<Long>();
        Collections.addAll(set, target);

        return target;
}

我不斷收到標題中指出的錯誤:

“ Collections類型中的方法addAll(Collection,T ...)不適用於參數(Set,long [])”

在我的方法看起來像這樣之前,但是我遇到了另一個錯誤:

public void noDups(long[] target){

    Set<long> set = new Hashset<long>(Arrays.asList(target));

我將Set初始化錯誤嗎? 誰能告訴我如何擺脫錯誤,或引導我朝正確的方向將long []轉換為Set。 謝謝!

如果數組已排序,則不需要嵌套的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應該包含所有條目,沒有任何重復。

我沒有方便的編譯器來測試這一點,但希望它有意義。

您不能以您嘗試的方式混合基元和包裝器-特別是Collections.addAll僅接受Long[] ,在這種情況下不接受long[]

接受您需要做一些循環來回轉換。 您需要遍歷數組並將元素一個接一個地添加到Set ,然后創建一個原始數組並遍歷Set以便將元素放入其中。

(或者您可以在現在使用Long[]任何地方都使用long[] ,但這效率不高,我會避免在您的位置使用它。)

您的方法存在幾個問題:

  1. 正如其他人所解釋的那樣,您不能僅具有Set<long> Set<Long>裝箱 long ,請參見Java中的自動裝箱 ),也不能使用addAll Set<Long> Long[]所有元素添加到Set<Long>addAll方法。

  2. 由於必須保留數字的順序,因此一次將所有值添加到集合中將無濟於事。 那將過濾掉重復項,但是您將失去順序。

  3. 由於輸入數組已經排序,因此實際上不需要任何其他數據結構即可刪除重復項。

這是一種O(n)技術,用於在數組的開始處排列唯一值,然后高效地復制數組,從而切斷不再需要的數組末端:

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 ,而只需使用Java 8流API。

 long[] dups = new long[]{1,2,3,4,4,4};
 long[] noDups = Arrays.stream(dups).distinct().toArray();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM