我有一个冒泡排序功能,它通过“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);
}
}
}
}
答案 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和那个比较器