使用对象的特定变量对链接列表进行排序?

时间:2012-05-26 22:46:54

标签: java sorting object

我有一个冒泡排序功能,它通过“a”变量命令SomeObj的LinkedList。如果我想同时按“b”变量排序列表怎么办?我该怎么做而不是用b写另一个函数?

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);
            }
        }
    }
}

7 个答案:

答案 0 :(得分:4)

使用compare方法在类中实现Comparator接口。 接受两个对象并比较它们返回-ve,0,+ ve值以告诉小于,等于或大于。

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

你的对象应该有所有这些字段的getter。

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

检查example

答案 1 :(得分:2)

您可以让SomeObj实现Comparable接口,然后让您的排序使用该接口与其进行交互。

答案 2 :(得分:2)

如果你可以通过第一个“a”排序,那么“b”就是在SomeObj类中实现Comparable并制作一个比较a和b的compareTo方法。 http://www.javapractices.com/topic/TopicAction.do?Id=10

答案 3 :(得分: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()
}

答案 4 :(得分:1)

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

答案 5 :(得分:1)

我猜有一种误解 - 它不是关于按a然后按b排序,它是一种2个列表,用户想要独立排序但不创建第二个列表,或者我是不对吗?

答案 6 :(得分: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和那个比较器