2011-04-12 63 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