2011-04-12 92 views
1

如何通過使用比較器來實現氣泡排序?如何使用比較器來實現氣泡排序?

謝謝。

這是我比較的樣子:

class ColumnSorter implements Comparator { 
    int colIndex; 

    ColumnSorter(int colIndex) { 
    this.colIndex = colIndex; 
    } 

    public int compare(Object a, Object b) { 
    Vector v1 = (Vector) a; 
    Vector v2 = (Vector) b; 
    Object o1 = v1.get(colIndex); 
    Object o2 = v2.get(colIndex); 

    if (o1 instanceof String && ((String) o1).length() == 0) { 
    o1 = null; 
    } 
    if (o2 instanceof String && ((String) o2).length() == 0) { 
    o2 = null; 
    } 

    if (o1 == null && o2 == null) { 
    return 0; 
    } else if (o1 == null) { 
    return 1; 
    } else if (o2 == null) { 
    return -1; 
    } else if (o1 instanceof Comparable) { 
     return ((Comparable) o1).compareTo(o2); 
    } else { 
    return o1.toString().compareTo(o2.toString()); 
} 
} 
} 

回答

3

您實現冒泡排序,就像你用,說<。然後,您將<替換爲someComparator.compare(Object o1, Object o2)

這裏的 「轉換規則」:

if (arr[i] < arr[j]) { 
    ... 
} 

成爲

if (someComparator.compare(arr[i], arr[j]) < 0) { 
    ... 
} 

(如果你使用>,你會用> 0代替< 0。)

您應該諮詢the documentation for Comparator爲更多細節。下面是第一句:

比較它的兩個參數的順序。由於第一個參數小於,等於或大於第二個參數,因此返回負整數,零或正整數。

+0

ohhh好吧,所以沒有特殊的方式實施冒泡排序吧?只是implment泡沫排序通常是正確的? – 2011-04-12 22:15:04

+0

是的。我會這樣認爲的。比較器僅適用於比較元素。它不會執行任何交換或分類。 – aioobe 2011-04-12 22:17:05

1

我假設你知道如何對Bubble Sort進行編碼,問題是如何使用比較器。

在你要比較兩個項目,以決定他們應該以何種順序冒泡排序每次迭代在哪裏,你會說:

if item1 < item2 then

你寫信:

if(comparator.compare(item1,item2) < 0) {

如果你會說:

if item1 > item2 then

那麼你就寫

if(comparator.compare(item1,item2) > 0) {

注意,<>保持不變,並保持你的項目相同的順序。如果你堅持這個規則,比較應該可以正常工作,所以剩下的就是實際的氣泡排序。

+0

我有一個自定義比較器,那麼我該怎麼做呢? – 2011-04-12 22:16:33

+0

你的比較器應該是java.util.Comparator類的一個實例。如上所述,您只需使用該實例即可。 – 2011-04-12 22:30:00

+0

是的,你是正確的,但我必須對JTable中的列進行排序,所以我必須使自定義比較器來比較列中的項目。 – 2011-04-12 22:31:59

0

最大的問題是爲什麼地球上你會想自己實現一個冒泡排序。冒泡排序是最慢的排序算法之一。

使用由JDK在java.util.Collections.sort()中提供的排序算法將會快得多爲您節省了相當多的一些代碼行。 Collections.sort()有一個方法需要Comparator,或者一個沒有使用對象的自然排序(如果它們實現了接口)。

+0

我的老師告訴我,我們必須使用冒泡排序。 – 2011-04-12 23:06:41