2012-05-26 89 views
0

我有一个气泡排序函数,它通过“a”变量来命令SomeObj的LinkedList。如果我想要通过“b”变量同时排列列表,该怎么办?我能做什么而不是用b写另一个函数?使用对象的特定变量对LinkedList进行排序?

public static void BubbleSort(LinkedList<SomeObj> objs) { 
    int len = objs.size(); 

    for(int pass = 1; pass < len; pass++) { 
     for (int i=0; i < len - pass; i++) { 
      if(objs.get(i).a > objs.get(i + 1).a) { 
       SomeObj p = objs.get(i); 
       objs.set(i,objs.get(i+1)); 
       objs.set(i + 1, p); 
      } 
     } 
    } 
} 
+0

不要使用Comparable接口,而不是使用Comparator。 比较适用于不经常更改比较标准的情况。 –

回答

4

与它比较方法的类实现Comparator接口。 接受两个对象,并比较它们返回-ve,0,+ ve值来告诉小于,等于或大于。

创建此Comparator对象并将其传递给冒泡排序方法,并让它使用它的比较方法比较两个对象。

你的对象应该有所有这些领域的getters。

此外,每当您想要更改对象的比较标准时,请使用不同的比较器。

检查这个example

+0

确切地说,接口可能不会返回-1或1.只需<0,分别> 0。 – Voo

+0

亚..我只是编辑! –

+0

您应该使签名通用以便重复使用。有关签名的示例,请参阅Collections.sort方法。有一个确保你传入一个实现Comparable的东西的列表,另一个传入任何东西的列表+一个比较器来完成同样的事情。请注意,现有的Collections.sort方法会执行修改的mergesort(google it)。 – Matt

2

你将不得不您someObj中实现Comparable界面,然后让排序使用界面进行操作。

1

决定哪一个具有最高优先级。检查更高优先级的变量 - 如果它们不同,就按照只对其进行排序的方式进行排序。如果高优先级变量匹配,那么你必须回到较低优先级的变量,并根据这个比较来进行整个比较。

if (obj1.getA() != obj2.getA()) { 
    // do compare on As 
    // e.g. return onj2.getA() - obj1.getA() 
} 
else { // A's match, so do compares on B 
    // e.g. return obj2.getB() - obj1.getB() 
} 
1

我认为最简单的方法是交换变量值而不是列表项。使用这种方法,您可以同时以不同的方式对列表进行“排序”。

1

我想有一种误解 - 它不是按a排序,而是按b排序,它是一种2列表,用户希望独立排序它们,但不创建第二个列表,或者我不对?

1

对于排序列表您可以使用

Collections.sort(List list, Comparator c)); 

想在这个主要方法

class Pair{ 
    int a; 
    int b; 

    public Pair(int a, int b) { 
     this.a=a; 
     this.b=b; 
    } 

    public String toString() { 
     // TODO Auto-generated method stub 
     return "["+a+","+b+"]"; 
    } 

    //test 
    public static void main(String[] args) { 
     Comparator<Pair> comparatorA=new Comparator<Pair>() { 
      @Override 
      public int compare(Pair o1, Pair o2) { 
       if (o1.a>o2.a) return 1; 
       if (o1.a<o2.a) return -1; 
       return 0; 
      } 
     }; 
     LinkedList<Pair> list=new LinkedList<>(); 
     list.add(new Pair(1,2)); 
     list.add(new Pair(2,1)); 
     list.add(new Pair(3,1)); 
     list.add(new Pair(1,3)); 

     Collections.sort(list, comparatorA); 
     System.out.println(list); 
    } 
} 

现在你可以只是做比较了B值和使用Collections.sort与比较

相关问题