在Java中使用比较器

时间:2015-06-17 18:27:24

标签: java c

我有一个tuple <Rank[0] , Rank[1]>并希望按递增顺序对其进行排序Rank [0]可以被视为第一个数字而Rank [2]被视为第二个数字。

这是我的功能:

  Arrays.sort(S,new Comparator<Tuples>() {

        public int compare(Tuples a, Tuples b) {
            // TODO Auto-generated method stub
            return (a.Rank[0]==b.Rank[0]) ? ((a.Rank[1]<b.Rank[1]) ? 1:0) :((a.Rank[0]<b.Rank[0])? 1:0);
        }
    });

上面提到的是分类数组,而它的C等价物就是

int cmp(struct suffix a, struct suffix b)
{
    return (a.rank[0] == b.rank[0])? (a.rank[1] < b.rank[1] ?1: 0):
               (a.rank[0] < b.rank[0] ?1: 0);
}

为什么我的java排序无效。请帮忙

static  class Tuples{

          int[] Rank = new int[2];
}

3 个答案:

答案 0 :(得分:1)

这样的事情:

public int compare(Tuples a, Tuples b) {
    int index = a.Rank[0] == b.Rank[0] ? 1: 0;
    return a.Rank[index] - b.Rank[index];
}

我认为更容易阅读。

答案 1 :(得分:0)

根据Comparator接口的文档,compare方法必须返回1,0或-1,即:

  • 0 =对象相等
  • -1(或任何负整数)= 对象a小于对象b
  • 1(或任何正整数)= 对象a大于对象b

所以你的方法必须如下:

public int compare(Tuples a, Tuples b) {
    if(a.Rank[0]==b.Rank[0]){ 
        if(a.Rank[1]==b.Rank[1]){ // a == b
            return 0;
        }else if(a.Rank[1]<b.Rank[1]){ // a < b
            return -1;
        }else{ // a > b
            return 1;
        }
    }else{ // a != b
        if(a.Rank[0]<b.Rank[0]){ // a < b
            return -1;
        }else{ //a > b
            return 1;
        }
    } 
}

或者简而言之(而且很丑陋)就是这样:

public int compare(Tuples a, Tuples b) {
   return (a.Rank[0]==b.Rank[0])?((a.Rank[1]==b.Rank[1])?0:((a.Rank[1]<b.Rank[1])?-1:1)):((a.Rank[0]<b.Rank[0])?-1:1);
}

答案 2 :(得分:0)

正如SqueezyMo在他的答案中所说的那样,缺少负整数。可以利用减法来获得紧凑的代码。

Arrays.sort(arr, new Comparator<Tuples>() {
  public int compare(Tuples a, Tuples b) {
    return a.Rank[0] == b.Rank[0] ? a.Rank[1] - b.Rank[1] : a.Rank[0] - b.Rank[0];
  }
});

当然,一切都可以使用三元运算符完成,它会让维护者疯狂。

public static void main(String[] args) {
  Tuples a = new Tuples();
  a.Rank = new int[]{1, 2};
  Tuples b = new Tuples();
  b.Rank = new int[]{0, 1};
  Tuples c = new Tuples();
  c.Rank = new int[]{1, 3};
  Tuples[] arr = {a, b, c};
  Arrays.sort(arr, new Comparator<Tuples>() {
    @Override
    public int compare(Tuples a, Tuples b) {
      return a.Rank[0] == b.Rank[0]
          ? a.Rank[1] == b.Rank[1]
              ? 0 : a.Rank[1] < b.Rank[1]
                  ? -1 : 1 : a.Rank[0] > b.Rank[0]
              ? 1 : -1;
    }
  });
  for (int i = 0; i < 3; i++) {
    System.out.println(arr[i].Rank[0] + ":" + arr[i].Rank[1]);
  }
}
static class Tuples {
  public int[] Rank;
}