如何根据一个属性对此列表进行排序?

问题描述:

有一个linked list包含objects.The对象o的属性被定义为:如何根据一个属性对此列表进行排序?

bandWidth 
ImageSize 
VmCount 

我怎么排序的bandWidth的基础上名单?让列表定义为:

list.add(o_1); 
list.add(o_2); 
list.add(o_3); 
list.add(o_4); 

现在我想对列表进行排序,使带宽最大的对象在列表中排在第一位。

+4

请参阅*比较器*接口进行自定义排序。 – Fernando

+0

请参阅http://*.com/questions/17675045/order-objects-according-to-integer-values/17675689#17675689 – neizan

Java的Collections类有一个静态sort方法,它在ListComparator实施

public static <T> void sort(List<T> list, Comparator<? super T> c) {...} 

实现自己Comparator到返回基于bandWidth的值。遵循compare(T o1, T o2)方法的规则

比较它的两个参数的顺序。返回一个负整数 零,或者一个正整数,因为第一个参数小于,等于 到或大于秒。

public static class MyComparator implements Comparator<MyObject> { 
    @Override 
    public int compare(MyObject o1, MyObject o2) { 
     return o1.getField() - o2.getField(); 
    }  
} 

public static class MyObject { 
    private int field; 
    public int getField() { 
     return field; 
    } 
    public void setField(int field) { 
     this.field = field; 
    } 
} 
+0

你可以请一个小例子解释 – saplingPro

+0

@saplingPro上面的东西。如果'o1'字段大于'o2',该方法将返回一个正数,表示'o1'应该在'o2'后面,因为'sort'按升序排列。 –

+0

@saplingPro这只是一个实现细节。如果'o1'上的字段较大,则差异将返回一个正数。如果相等,它将返回0.如果它较小,它将返回一个负数。只要你遵循应该返回的规则,你就没事。你可以用'if-else'和'>','

这里有一个最低工作例如:

import java.util.Collections; 
import java.util.Comparator; 
import java.util.LinkedList; 
import java.util.List; 

class MyClass { 
    int bandWidth; 
    int imageSize; 
    int VmCount; 

    public MyClass(int bandWidth, int imageSize, int VmCount) { 
     this.bandWidth = bandWidth; 
     this.imageSize = imageSize; 
     this.VmCount = VmCount; 
    } 
} 

class MyComparator implements Comparator<MyClass> { 
    public int compare(MyClass object1, MyClass object2){ 
     return object2.bandWidth - object1.bandWidth; // sort the list in descending order 
     //return object1.bandWidth - object2.bandWidth; // sort the list in ascending order 
    } 
} 

public class Test { 
    public static void main(String[] args) { 
     List<MyClass> objects = new LinkedList<>(); 
     objects.add(new MyClass(1,2,3)); 
     objects.add(new MyClass(3,2,3)); 
     objects.add(new MyClass(2,2,3)); 
     Collections.sort(objects, new MyComparator()); 
     for (MyClass object: objects) { 
      System.out.println(object.bandWidth); 
     } 
    } 
} 

既然你不完全了解这行代码:

return object2.bandWidth - object1.bandWidth; 

让我们尝试实现它换句话说:

if (object2.bandWidth > object1.bandWidth) { 
    return 1; //it can be any positive number 
} else if (object2.bandWidth == object1.bandWidth){ 
    return 0; 
} else { 
    return -1; //it can be any negative number 
} 
+0

可以请你解释你的比较方法 – saplingPro

+0

@saplingPro请参阅[本教程](http://www.mkyong.com/java/java-object-sorting-example-comparable-and-comparator/)。 –

+0

当我调用'Collections.sort(objects,new MyComparator())时会发生什么;'虽然结果很好,但我不明白排序如何发生? – saplingPro