我正在閱讀 Liang 的 Java 書籍,其中一個練習讓您實作了一種方法來對數字的 ArrayList (ArrayList <Number>) 進行排序。方法標頭如下所示:
public static void sort(ArrayList<Number> list)
我剛剛在之前的練習中為數字的 ArrayList (同樣是 ArrayList <Number>)實作了一個 shuffle 方法,這非常簡單明了。
我有點困惑,因為 shuffle 和 sort 練習都被標記為具有相同的難度。然而,在開始使用 sort 方法后,我意識到實作它并不像 shuffle 方法那么簡單或簡單(沒有用于 Numbers 的 compareTo 方法)。事實上,似乎我必須通過檢查每個子類(整數、雙精度等)來實作我自己的數字可比介面。這似乎非常乏味......
這兩個練習具有相同的難度這一事實表明我可能缺少一些更簡單的解決方案。
我偏離軌道了嗎?
uj5u.com熱心網友回復:
快速回答:
public static void sort(ArrayList<Number> list) {
list.sort(Comparator.nullsFirst(Comparator.comparingDouble(Number::doubleValue)));
}
您可以檢查以下輸入資料:
public static void main(String[] args) {
ArrayList<Number> list = new ArrayList<>(Arrays.asList(12,58,62,34,-74,25.8,214.7,1544,null,78899,-12.2));
sort(list);
System.out.println(list);
}
public static void sort(ArrayList<Number> list) {
list.sort(Comparator.nullsFirst(Comparator.comparingDouble(Number::doubleValue)));
}
首先檢查空值,然后通過將它們轉換為 Double 來比較兩個非空數字,這是標準數字擴展中最全面的數字表示。
您還必須使用至少版本 8 的 Java,因為此實作使用 lambdas,這在以前的版本中不存在。
uj5u.com熱心網友回復:
我能想到的唯一方法是添加一個違反所需簽名的比較器引數。
List<Number> doubleList = new ArrayList<>(List.of(10.,8.,2.,3.));
Comparator<Number> doubleComp = (a,b)->{
double aa = a.doubleValue();
double bb = b.doubleValue();
return aa < bb ? -1 : aa > bb ? 1 : 0;
};
sort(doubleList, doubleComp);
System.out.println(doubleList);
印刷
[2.0, 3.0, 8.0, 10.0]
排序方法
public static void sort(List<Number> list, Comparator<Number> comp) {
for (int i = 0; i < list.size()-1; i ) {
for(int k = i 1; k < list.size(); k ) {
if (comp.compare(list.get(i),list.get(k)) > 0) {
Number temp = list.get(i);
list.set(i, list.get(k));
list.set(k, temp);
}
}
}
}
但更好的方法是撰寫一個可以接受任何型別的通用排序方法T that implements Comparable<T>
uj5u.com熱心網友回復:
你可以有許多不同的排序演算法,大多數基礎是快速排序、冒泡排序、合并排序。
我可以建議先實施冒泡排序。如果相鄰元素放置不正確,冒泡排序通過交換相鄰元素來作業。從陣列的開頭重復交換,直到所有元素都按順序排列。我們知道,當我們設法在完全不交換的情況下進行整個迭代時,所有元素都是有序的。
public static void bubbleSort(int[] a) {
boolean sorted = false;
int temp;
while(!sorted) {
sorted = true;
for (int i = 0; i < array.length - 1; i ) {
if (a[i] > a[i 1]) {
temp = a[i];
a[i] = a[i 1];
a[i 1] = temp;
sorted = false;
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/427792.html
