我們需要定義一個包含以下靜態泛型方法的 Tools 類:parallelSort 接受一個 ArrayList 型別的引數并回傳引數串列的排序版本而不修改它:
將串列分成兩部分并制作一份副本
通過創建 SortingThread 的實體來啟動兩個執行緒,其中每個執行緒對上一步中獲得的一個副本進行排序
合并兩個執行緒產生的結果
我收到此錯誤:
Exception in thread "main" java.lang.ArrayStoreException:
arraycopy: source type java.util.ArrayList is not an array
at
java.base/java.lang.System.arraycopy(Native Method)
這是我的代碼:
import java.util.ArrayList;
public class Tools {
public static <T> ArrayList<T> parallelSort(ArrayList<T> arr){
//Obtaining the first Half and making a copy of it
ArrayList<T> FirstHalf = new ArrayList<T>(arr.size()/2);
System.arraycopy(arr, 0, FirstHalf, 0, arr.size()/2);
//Obtaining the second Half and making a copy of it
ArrayList<T> SecondHalf = new ArrayList<T>(arr.size()- (arr.size()/2));
System.arraycopy(arr, arr.size()/2, SecondHalf, 0, arr.size()- (arr.size()/2));
//Creating Thread
SortingThread<T> thread1 = new SortingThread<T>();
//Start Thread
thread1.start(); //Creating Thread parallelSort
//Creating Thread
SortingThread<T> thread2 = new SortingThread<T>();
//Start Thread
thread2.start();
return arr;
}
public static <T> boolean areEqual(ArrayList<T> arr1, ArrayList<T> arr2) {
return arr1.equals(arr2);
}
public static void main(String[] args) {
//Testing on list of complex numbers
Complex c1= new Complex(3,4);
Complex c2= new Complex(2,2);
Complex c3= new Complex(1,2);
ArrayList<Complex> a1= new ArrayList<Complex>();
a1.add(c1);
a1.add(c2);
a1.add(c3);
System.out.println("The Original two lists:");
System.out.println(a1);
System.out.print(Tools.parallelSort(a1));
}
}
uj5u.com熱心網友回復:
例外情況清楚地說明了這一點。Java 是一種強型別語言。所以你不能使用陣列串列中的位置的陣列。顯然arraycopy()方法只支持陣列型別而不支持串列。
uj5u.com熱心網友回復:
該java.lang.System#arrayCopy方法接受一個陣列型別作為它的第一個和第三個引數。
ArrayList在使用以下#toArray方法復制其專案之前,您應該將輸入轉換為和陣列:
ArrayList<T> FirstHalf = new ArrayList<T>(arr.size()/2)
System.arraycopy(arr.toArray(), 0, FirstHalf.toArray(), 0, arr.size()/2);
同時,這將使您的FirstHalf串列無用,因為:
- 該
#toArray方法回傳一個陣列,該陣列未通過任何方式從原始陣列中參考ArrayList - 目標陣列在訪問時將關閉索引,因為它不包含任何元素
然后我建議您檢查您的實作,以在最后使用從 entry 到 result 的陣列(將后者轉換為 an ArrayList),或者使用另一種方法,例如:
ArrayList<T> FirstHalf = new ArrayList<T>(arr.size()/2);
Object [] temp = new Object[arr.size()/2];
System.arraycopy(arr.toArray(), 0, temp, 0, arr.size()/2);
FirstHalf.addAll(Arrays.asList(temp));
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/342775.html
上一篇:即使使用@Autowire,組件中的SpringRepository也是空的
下一篇:沒有得到正確的輸入來檢查重復項
