将C ++排序函数移植到Java

时间:2015-07-06 10:39:05

标签: java

将c ++代码移植到Java时遇到问题。我有一个对的列表如下

vector<pair<pair<int,int>,int> > M;

我用Java编写了等效的

List<Pair<Pair<Integer,Integer>,Integer>> pairList = new ArrayList<>();

现在在c ++代码中,M充满了值,相应地我在Java中做了同样的事情。现在,c ++有一个排序功能如下

sort(M.begin(), M.end());

这是我的问题,我需要用Java编写的等效比较器是什么? 我该如何使用它?我假设以下几行

Collections.sort(pairList, new MyComparator())

有人可以帮我理解 MyComparator 会是什么吗?

配对课程如下

class Pair<K,V>{

    K k;
    V v;

    public void makePair(K k, V v){     
        this.k = k;
        this.v = v;
    }
}

解决方案

我最终按照以下方式对 MyComparator 进行了实施

static class MyComparator implements Comparator<Pair<Pair<Integer,Integer>,Integer>>{

    @Override
    public int compare(Pair<Pair<Integer,Integer>,Integer> p1,Pair<Pair<Integer,Integer>,Integer> p2){

        int a = p1.k.v.compareTo(p2.k.v);
        if(a==0) return a;
        else return p1.k.k.compareTo(p2.k.k);
    }
 }

谢谢大家。

3 个答案:

答案 0 :(得分:1)

您的Comparator应该是实现接口Comparator<T>的类。 T是与您的集合相关联的泛型类型。

对你而言Pair<Pair<Integer,Integer>,Integer>

所以你应该有这样的课程:

public Class MyComparator implements Comparator<Pair<Pair<Integer,Integer>,Integer>> {

    @Override
    public int compare(Pair<Pair<Integer,Integer>,Integer> o1, Pair<Pair<Integer,Integer>,Integer> o2) {
        // Here you should put your comparison code :
        // return 0 if the 2 objects are the same
        // return -1 (or another negative int) if the o2 > o1
        // return 1 (or another positive int) if o2 < o1

    }

}

答案 1 :(得分:0)

MyComparator需要实现Comparator,以便Java知道如何比较列表中的元素。它可以以ComparatorComparable两种形式完成。

一个很好的例子是here

答案 2 :(得分:0)

通过使java Pair类的行为类似于C ++ std::pair,可以完全避免使用比较器。 Apache Commons Lang有Pair可以做你想要的。

但是:为什么不使用正确的自定义数据类而不是嵌套对?我已经认为C ++版本非常麻烦。

如果您不想使用它,请自行动手:

class Pair<K extends Comparable<K>,V extends Comparable<V>>
   implements Comparable<Pair<K, V>> 
{
   // have a immutable pairs
   final K k;
   final V v;

   Pair(final K k, final V v)
   {
       this.k = k;
       this.v = v;
   }

   // factory function, the same as in C++ 
   // (where it exists because template syntax is akward)
   // (as is generics syntax)
   public static <K extends Comparable<K>, V extends Comparable<V>> Pair<K, V> makePair(K k, V v)
   {     
         return new Pair(k, v);
   }

   @override
   public int compareTo(final Pair<K, V> other)
   {
        int compare = this.k.compareTo(other.k);
        if (compare == 0) {
            compare = this.v.compareTo(other.v);
        }
        return compare;
   }

   // NOTE: we also need equals() and hashCode() for a proper class.
}

我尝试避免编写隐式Comparator并将其传递给sort函数,除非您需要特殊的套装排序。