[英]The method Encrypt(long, long, long, long, int) in the type prince is not applicable for the arguments (String, long, long, long, int)
[英]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[]
,但這效率不高,我會避免在您的位置使用它。)
您的方法存在幾個問題:
正如其他人所解釋的那樣,您不能僅具有Set<long>
Set<Long>
( 裝箱 long
,請參見Java中的自動裝箱 ),也不能使用addAll
Set<Long>
Long[]
所有元素添加到Set<Long>
中addAll
方法。
由於必須保留數字的順序,因此一次將所有值添加到集合中將無濟於事。 那將過濾掉重復項,但是您將失去順序。
由於輸入數組已經排序,因此實際上不需要任何其他數據結構即可刪除重復項。
這是一種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.